如何使用RapidXml解析XML文件

ash*_*shd 19 c++ xml parsing rapidxml

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

我对此表示怀疑doc.parse<0>(xml).

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

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

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

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

谢谢!!!

Ashd

Sup*_*Jon 29

RapidXml附带了一个类,可以rapidxml::filerapidxml_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());
...
}
Run Code Online (Sandbox Code Playgroud)

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


Fli*_*McF 9

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

因人而异!

喊出SiCrane这个线程: - ,只是用矢量替换"字符串" ---(感谢阿鲁)

请评论并帮助我学习!我对此很新

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

#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 */


}
Run Code Online (Sandbox Code Playgroud)


Mar*_* Ba 0

说明书告诉我们:

函数 xml_document::parse

[...] 根据给定标志解析以零结尾的 XML 字符串。

RapidXML 让您从文件中加载字符数据。要么将文件读入缓冲区,就像anno建议的那样,要么使用某种内存映射技术。(但首先查找parse_non_destructive标志。)