2014-03-14 107 views
0

我正在使用RapidXML來解析XML文件並讀取節點內容,但我不想讀取節點內的值,我需要讀取特定XML節點的內容「as XML」而不是解析值。使用RapidXML讀取XML節點

例子:

<node1> 
    <a_lot_of_xml> 
     <....> 
    </a_lot_of_xml> 
</node1> 

我需要得到node1內容爲:

<a_lot_of_xml> 
    <....> 
</a_lot_of_xml> 

我累了:

我試過的東西,但它不是真的好,我意見,其即將放入node1,其他XML文件的路徑來讀取,我這樣做:

<file1ToRead>MyFile.xml</file1ToRead> 

然後我的C++代碼如下:

ifstream的文件(FileToRead);

stringstream buffer;緩衝區< < file.rdbuf();

但問題是用戶將有很多XML文件來維護,我只想使用一個XML文件。

回答

1

我認爲「很多XML文件」是一種更好的方式,因此您有一個所有xml文件的目錄,您可以在需要時讀取xml文件,以提高性能。 回到問題中,可以使用rapidxml :: print函數來獲取xml格式。

bool test_analyze_xml(const std::string& xml_path) 
{ 
    try 
    { 
     rapidxml::file<> f_doc(xml_path.c_str()); 
     rapidxml::xml_document<> xml_doc; 
     xml_doc.parse<0>(const_cast<char*>(f_doc.data())); 
     rapidxml::xml_node<>* node_1 = xml_doc.first_node("node1"); 
     if(node_1 == NULL) 
     { 
      return false; 
     } 
     rapidxml::xml_node<>* plain_txt = node_1->first_node("a_lot_of_xml"); 
     if (plain_txt == NULL) 
     { 
      return false; 
     } 
     std::string xml_data; 
     rapidxml::print(std::back_inserter(xml_data), *plain_txt, rapidxml::print_no_indenting); //the xml_data is XML format. 
    } 
    catch (...) 
    { 
     return false; 
    } 
    return true; 
} 
+0

謝謝你,非常有用的答案!我嘗試了它,併爲我的項目工作正常! – Ozon3

0

我對rapidxml不熟悉,但是我已經用tinyxml2完成了這項工作。訣竅是讀出node1,然後在node1中創建一個包含所有內容的新XMLDoc(使用tinyxml2術語)。從那裏開始,您可以使用它們的XMLPrinter類將新的XMLDoc(包含node1中的所有內容)轉換爲字符串。

tinyxml2是免費下載。