2010-10-26 124 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,輸出將縮進。