21

我必须在 C++ 中解析一个 XML 文件。我正在研究并为此找到了 RapidXml 库。

我对doc.parse<0>(xml).

可以xml是 .xml 文件还是必须是stringor char *

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

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

如果这在 RapidXml 中是不可能的,那么请在 C++ 中推荐一些其他 XML 库。

谢谢!!!

阿什德

4

4 回答 4

34

rapidxml::fileRapidXml在文件中带有一个类来为您执行此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 等),以便文档保持有效。

于 2013-01-25T15:03:01.503 回答
9

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

YMMV!

在此线程上向 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 */


}
于 2011-05-15T17:18:50.680 回答
1

我们通常将 XML 从磁盘读取到 astd::string中,然后将其安全地复制到 astd::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]);

如需完整的源代码检查:

使用 C++ 从 xml 文件中读取一行

于 2011-06-14T18:50:19.713 回答
0

手册告诉我们:

函数 xml_document::parse

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

RapidXML 将文件中的字符数据加载给您。要么将文件读入缓冲区,就像anno建议的那样,要么使用一些内存映射技术。(但先查一下parse_non_destructiveflag。)

于 2010-09-13T12:34:06.053 回答