使用RapidXML读取XML节点

时间:2014-03-14 07:40:39

标签: c++ xml rapidxml

我使用RapidXML解析XML文件和读取节点内容但我不想读取节点内的值,我需要读取特定XML节点的内容"作为XML&# 34;不是解析的值。

示例:

<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;缓冲区&lt;&lt; file.rdbuf();

但问题是用户需要维护很多XML文件,我只想使用一个xml文件。

2 个答案:

答案 0 :(得分:1)

我认为&#34;很多XML文件&#34;是一种更好的方法,所以你有一个所有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;
}

答案 1 :(得分:0)

我对rapidxml不熟悉,但我用tinyxml2做了这个。诀窍是读出node1然后创建一个新的XMLDoc(在这里使用tinyxml2术语),其中包含node1内的所有内容。从那里,您可以使用他们的XMLPrinter类将新的XMLDoc(包含node1中的所有内容)转换为字符串。

tinyxml2是免费下载的。