0

我正在使用 RapidXML 解析 XML 文件并读取节点内容,但我不想读取节点内的值,我需要“作为 XML”读取特定 XML 节点的内容,而不是作为解析值。

例子 :

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

我需要获取node1as 的内容:

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

我累了什么:

我尝试了一些东西,但在我看来它并不是很好,它即将放入 node1,另一个要读取的 xml 文件的路径,我确实喜欢这样:

<file1ToRead>MyFile.xml</file1ToRead>

然后我的 C++ 代码如下:

ifstream 文件(FileToRead);

串流缓冲区;缓冲区 << file.rdbuf();

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

4

2 回答 2

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;
}
于 2014-03-14T11:32:35.860 回答
0

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

tinyxml2 是免费下载的。

于 2014-03-14T08:36:14.377 回答