#include "xml_tree_writer.h" #include #include #include #include #include "SyntaxTree.h" #include "XmlTree.h" namespace MosesTraining { namespace Syntax { void XmlTreeWriter::Write(const SyntaxTree &tree) const { assert(!tree.IsLeaf()); // Opening tag out_ << "first != "label") { out_ << " " << p->first << "=\"" << p->second << "\""; } } out_ << ">"; // Children for (std::vector::const_iterator p = tree.children().begin(); p != tree.children().end(); ++p) { SyntaxTree &child = **p; if (child.IsLeaf()) { out_ << " " << Escape(child.value().label); } else { out_ << " "; Write(child); } } // Closing tag out_ << " "; if (tree.parent() == 0) { out_ << std::endl; } } // Escapes XML special characters. std::string XmlTreeWriter::Escape(const std::string &s) const { if (!escape_) { return s; } std::string t; std::size_t len = s.size(); t.reserve(len); for (std::size_t i = 0; i < len; ++i) { if (s[i] == '<') { t += "<"; } else if (s[i] == '>') { t += ">"; } else if (s[i] == '[') { t += "["; } else if (s[i] == ']') { t += "]"; } else if (s[i] == '|') { t += "|"; } else if (s[i] == '&') { t += "&"; } else if (s[i] == '\'') { t += "'"; } else if (s[i] == '"') { t += """; } else { t += s[i]; } } return t; } } // namespace Syntax } // namespace MosesTraining