我必须用C ++解析XML文件。我正在研究并找到了RapidXml库。
我怀疑doc.parse<0>(xml)
。
xml
可以是.xml文件还是需要string
或char *
?
如果我只能使用string
或char *
,那么我想我需要读取整个文件并将其存储在char数组中并将其指针传递给函数?
有没有办法直接使用文件,因为我还需要更改代码中的XML文件。
如果在RapidXml中无法做到这一点,请在C ++中推荐一些其他XML库。
感谢!!!
Ashd
答案 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]);
要获得完整的源代码检查:
答案 3 :(得分:0)