2010-10-26 40 views
2

我正在查找用于缩进xml行的C++代码。我不想与图书馆联系。用于缩进XML行的C++代码

我有我的流中这样一行

<root><a>value_a</a><b>value_b</b></root> 

,我想打印在多行的方式(与标签)。

<root> 
    <a>value_a</a> 
    <b>value_b</b> 
</root> 

它是否会对任何人敲响警钟?

+0

我曾经问过这样的事情,但不幸的是,C++不会提供可以使用的默认值,PHP和C#都可以使用。 – 2010-10-26 07:26:18

回答

2

如果你不想使用库,你将不得不自己写。这应该不会太难。您首先必须将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 
} 

希望这有助于你一点。

2

使用TinyXML


有一个class TiXmlPrinter那里,这会为你做这项工作。此外,与TiXmlDocument合作非常简单,快速且清晰。

解析整个XML文档也非常简单。通过TinyXML,您可以像真正的树一样操作XML结构。库中头部有一个非常好的JavaDoc。

+0

我无法在我的系统中添加此库。有纯粹的C++代码吗? – cateof 2010-10-26 07:31:22

+0

它是纯粹的C++代码,带有头文件和cpp文件。否则,我不知道其他任何方式,可能您需要为XML编写自己的解析器或打印机。 – 2010-10-26 07:36:48

+1

@cateof:如果您的信息有问题,您应该添加此类信息。 – 2010-10-26 07:50:14

0

您也可以使用libxml函数xmlSaveFormatFile(const char * filename,xmlDocPtr cur,int格式)。第一个参数是要写入的文件的名称,第二个参数是指向xmlDoc结构的指针,通过将第三个参数设置为1,输出将缩进。