我正在查找用于缩进xml行的C++代码。我不想与图书馆联系。用于缩进XML行的C++代码
我有我的流中这样一行
<root><a>value_a</a><b>value_b</b></root>
,我想打印在多行的方式(与标签)。
<root>
<a>value_a</a>
<b>value_b</b>
</root>
它是否会对任何人敲响警钟?
我正在查找用于缩进xml行的C++代码。我不想与图书馆联系。用于缩进XML行的C++代码
我有我的流中这样一行
<root><a>value_a</a><b>value_b</b></root>
,我想打印在多行的方式(与标签)。
<root>
<a>value_a</a>
<b>value_b</b>
</root>
它是否会对任何人敲响警钟?
如果你不想使用库,你将不得不自己写。这应该不会太难。您首先必须将tokenize流转换为标记和值。这是我猜测的最难的部分。然后你必须将令牌写入流中。对于开始标记后面的每个开始标记,都会增加缩进量,对于结束标记后面的每个结束标记,都会减少缩进量。
标记化的一些提示。我想我会尝试是写一个简单的XMLToken类是这样的:
class XMLToken {
public:
enum ElementType { OpenTag, CloseTag, Value };
std::string content;
ElementType elementType;
};
这些成员应与相应的getter和setter进行封装,这只是为了说明。然后,我会过载流提取运算此类型:
std::istream & operator >>(st::istream & stream, XMLToken & token) {
// if first char is '<', then token is a tag, otherwise a value
// read until '>' is found for a tag and until '<' is found for a value
return stream;
}
然后你可以使用一个istream_iterator
的标化流:
typedef std::istream_iterator<XMLToken> XMLTokenizer;
for (XMLTokenizer it = XMLTokenizer(some_istream); it != XMLTokenizer; it++) {
// process token
}
希望这有助于你一点。
使用TinyXML
有一个class TiXmlPrinter
那里,这会为你做这项工作。此外,与TiXmlDocument
合作非常简单,快速且清晰。
解析整个XML文档也非常简单。通过TinyXML
,您可以像真正的树一样操作XML结构。库中头部有一个非常好的JavaDoc。
我无法在我的系统中添加此库。有纯粹的C++代码吗? – cateof 2010-10-26 07:31:22
它是纯粹的C++代码,带有头文件和cpp文件。否则,我不知道其他任何方式,可能您需要为XML编写自己的解析器或打印机。 – 2010-10-26 07:36:48
@cateof:如果您的信息有问题,您应该添加此类信息。 – 2010-10-26 07:50:14
您也可以使用libxml函数xmlSaveFormatFile(const char * filename,xmlDocPtr cur,int格式)。第一个参数是要写入的文件的名称,第二个参数是指向xmlDoc结构的指针,通过将第三个参数设置为1,输出将缩进。
我曾经问过这样的事情,但不幸的是,C++不会提供可以使用的默认值,PHP和C#都可以使用。 – 2010-10-26 07:26:18