我正在查找用於縮進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