如何使用RapidXml解析XML文件

时间:2010-05-11 04:12:29

标签: c++ xml parsing rapidxml

我必须用C ++解析XML文件。我正在研究并找到了RapidXml库。

我怀疑doc.parse<0>(xml)

xml可以是.xml文件还是需要stringchar *

如果我只能使用stringchar *,那么我想我需要读取整个文件并将其存储在char数组中并将其指针传递给函数?

有没有办法直接使用文件,因为我还需要更改代码中的XML文件。

如果在RapidXml中无法做到这一点,请在C ++中推荐一些其他XML库。

感谢!!!

Ashd

4 个答案:

答案 0 :(得分:29)

RapidXml附带了一个类,可以在rapidxml::file文件中为您rapidxml_utils.hpp执行此操作。 类似的东西:

#include "rapidxml_utils.hpp"

int main() {
    rapidxml::file<> xmlFile("somefile.xml"); // Default template is char
    rapidxml::xml_document<> doc;
    doc.parse<0>(xmlFile.data());
...
}

请注意,xmlFile对象现在包含XML的所有数据,这意味着一旦它超出范围并被销毁,doc变量就不再安全可用。如果在函数内部调用parse,则必须以某种方式将xmlFile对象保留在内存中(全局变量,new等),以使文档保持有效。

答案 1 :(得分:8)

我自己是C ++的新手......但我想分享一个解决方案。

YMMV!

在此thread上向SiCrane喊出:   - 只是用矢量替换'字符串'---(谢谢anno)

请评论并帮助我学习!我对这个很新。

无论如何,这似乎有一个良好的开端:

#include <iostream>
#include <fstream>
#include <vector>

#include "../../rapidxml/rapidxml.hpp"

using namespace std;

int main(){
   ifstream myfile("sampleconfig.xml");
   rapidxml::xml_document<> doc;

   /* "Read file into vector<char>"  See linked thread above*/
   vector<char> buffer((istreambuf_iterator<char>(myfile)), istreambuf_iterator<char>( ));

   buffer.push_back('\0');

   cout<<&buffer[0]<<endl; /*test the buffer */

   doc.parse<0>(&buffer[0]); 

   cout << "Name of my first node is: " << doc.first_node()->name() << "\n";  /*test the xml_document */


}

答案 2 :(得分:1)

我们通常会将磁盘中的XML读入std::string,然后将其安全复制到std::vector<char>,如下所示:

string input_xml;
string line;
ifstream in("demo.xml");

// read file into input_xml
while(getline(in,line))
    input_xml += line;

// make a safe-to-modify copy of input_xml
// (you should never modify the contents of an std::string directly)
vector<char> xml_copy(input_xml.begin(), input_xml.end());
xml_copy.push_back('\0');

// only use xml_copy from here on!
xml_document<> doc;
// we are choosing to parse the XML declaration
// parse_no_data_nodes prevents RapidXML from using the somewhat surprising
// behavior of having both values and data nodes, and having data nodes take
// precedence over values when printing
// >>> note that this will skip parsing of CDATA nodes <<<
doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

要获得完整的源代码检查:

Read a line from xml file using C++

答案 3 :(得分:0)

manual告诉我们:

  

function xml_document :: parse

     

[...]解析零终止的XML字符串   根据给定的旗帜。

RapidXML会将文件中的字符数据加载到您的身上。将文件读入缓冲区,如建议的anno,或者使用一些内存映射技术。 (但首先查看parse_non_destructive标志。)