C++ 需要一个非常简单的示例来解析和编写C或C+中的XML文档+;
我从事一个C项目,需要实现一些与XML文件的交互 我需要一个非常简单的例子来解析和编写XML文件 我真的更喜欢一个小的库(比如一个.h文件和一个.c文件),而不是一个需要安装的库 如果有人能告诉我:C++ 需要一个非常简单的示例来解析和编写C或C+中的XML文档+;,c++,c,xml,C++,C,Xml,我从事一个C项目,需要实现一些与XML文件的交互 我需要一个非常简单的例子来解析和编写XML文件 我真的更喜欢一个小的库(比如一个.h文件和一个.c文件),而不是一个需要安装的库 如果有人能告诉我: 如何解析以下示例中的数据 如何生成以下示例中的数据 XML数据: <root> <source name = 'source1' isReadOnly = 'false'> <view name = 'view1' />
- 如何解析以下示例中的数据
- 如何生成以下示例中的数据
<root>
<source name = 'source1' isReadOnly = 'false'>
<view name = 'view1' />
<view name = 'view2' />
</source>
<source name = 'source2' isReadOnly = 'true'>
<view name = 'view1' />
<view name = 'view2' />
</source>
</root>
互联网上有很多关于这方面的文章。假设您在windows上,请查找以下示例以供参考:-
<?xml version="1.0" encoding="UTF-8"?>
<Car>
<Wheels>
<Wheel1>FL</Wheel1>
<Wheel2>FR</Wheel2>
<Wheel3>RL</Wheel3>
<Wheel4>RR</Wheel4>
</Wheels>
</Car>
佛罗里达州
FR
RL
RR
代码如下:
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#import <msxml6.dll> rename_namespace(_T("MSXML"))
int main(int argc, char* argv[])
{
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
try
{
MSXML::IXMLDOMDocument2Ptr xmlDoc;
hr = xmlDoc.CreateInstance(__uuidof(MSXML::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);
// TODO: if (FAILED(hr))...
if (xmlDoc->load(_T("input.xml")) != VARIANT_TRUE)
{
printf("Unable to load input.xml\n");
}
else
{
printf("XML was successfully loaded\n");
xmlDoc->setProperty("SelectionLanguage", "XPath");
MSXML::IXMLDOMNodeListPtr wheels = xmlDoc->selectNodes("/Car/Wheels/*");
printf("Car has %u wheels\n", wheels->Getlength());
MSXML::IXMLDOMNodePtr node;
node = xmlDoc->createNode(MSXML::NODE_ELEMENT, _T("Engine"), _T(""));
node->text = _T("Engine 1.0");
xmlDoc->documentElement->appendChild(node);
hr = xmlDoc->save(_T("output.xml"));
if (SUCCEEDED(hr))
printf("output.xml successfully saved\n");
}
}
catch (_com_error &e)
{
printf("ERROR: %ws\n", e.ErrorMessage());
}
CoUninitialize();
}
return 0;
}
#包括
#包括
#包括
#导入重命名命名空间(_T(“MSXML”))
int main(int argc,char*argv[])
{
HRESULT hr=协同初始化(NULL);
如果(成功(hr))
{
尝试
{
MSXML::IXMLDOMDocument2Ptr xmlDoc;
hr=xmlDoc.CreateInstance(uuuidof(MSXML::DOMDocument60),NULL,CLSCTX_INPROC_SERVER);
//TODO:如果(失败(hr))。。。
if(xmlDoc->load(_T(“input.xml”)!=VARIANT\u TRUE)
{
printf(“无法加载input.xml\n”);
}
其他的
{
printf(“XML已成功加载\n”);
xmlDoc->setProperty(“SelectionLanguage”、“XPath”);
MSXML::IXMLDOMNodeListPtr wheels=xmlDoc->selectNodes(“/Car/wheels/*”);
printf(“汽车有%u个轮子\n”,轮子->Getlength());
MSXML::IXMLDOMNodePtr节点;
node=xmlDoc->createNode(MSXML::node_元素,_T(“引擎”),_T(“”);
节点->文本=_T(“引擎1.0”);
xmlDoc->documentElement->appendChild(节点);
hr=xmlDoc->save(_T(“output.xml”);
如果(成功(hr))
printf(“output.xml已成功保存\n”);
}
}
捕获(_com_error&e)
{
printf(“错误:%ws\n”,例如ErrorMessage());
}
coninitialize();
}
返回0;
}
您也可以查阅以下链接:-
与此相反,如果您在linux平台上,则选择TinyXml:-
我发现pugixml非常易于使用。它是一个小的源文件,可以编译到项目中 示例C++03:
#include <fstream>
#include <iostream>
#include "pugixml.hpp"
int main()
{
using namespace pugi;
// Load XML file from fstream
std::ifstream xml_file("test.xml");
if(!xml_file)
{
std::cerr << "ERROR: opening XML file: " << std::endl;
return 1;
}
xml_document doc;
xml_parse_result res = doc.load(xml_file);
if(!res)
{
std::cerr << "ERROR: " << res.description() << std::endl;
return 1;
}
// get all children of <root><source>
xml_object_range<xml_named_node_iterator> sources =
doc.child("root").children("source");
// Iterate through <root><source> children
xml_named_node_iterator s;
for(s = sources.begin(); s != sources.end(); ++s)
{
// get all children named <root><source><view>
xml_object_range<xml_named_node_iterator> views =
s->children("view");
// Iterate through <root><source><view> children
xml_named_node_iterator v;
for(v = views.begin(); v != views.end(); ++v)
std::cout << v->attribute("name").value() << '\n';
}
}
#include <fstream>
#include <iostream>
#include "pugixml.hpp"
int main()
{
using namespace pugi;
std::ifstream xml_file("test.xml");
if(!xml_file)
{
std::cerr << "ERROR: opening XML file: " << std::endl;
return 1;
}
xml_document doc;
xml_parse_result res = doc.load(xml_file);
if(!res)
{
std::cerr << "ERROR: " << res.description() << std::endl;
return 1;
}
auto sources = doc.child("root").children("source");
for(auto&& s: sources)
{
auto views = s.children("view");
for(auto&& v: views)
std::cout << v.attribute("name").value() << '\n';
}
}
#包括
#包括
#包括“pugixml.hpp”
int main()
{
使用名称空间pugi;
//从fstream加载XML文件
std::ifstreamxml_文件(“test.xml”);
如果(!xml_文件)
{
cerr Boost属性树可以用来解析XML。-我认为它只是头文件。“我真的更喜欢一个小的库(比如一个.h文件和一个.c文件)”您可能有一个很大的误解。正确解析XML是一项复杂得多的任务,可以在单个模块中合理地解决。使用pugixml解析器。它简单易行!为什么要回避使用已被证明能够完成其任务的更大且完善的库?它可能会摧毁孤独天才的神话,但>50%的工作是使用和理解他人的工作。但是,如果您的任务是明确地从头开始设计一个最低限度的XML解析器,那么您可能希望了解使用boost进行正则表达式解析的情况,这也是一个相当沉重的库……我想要一个完善的“标准”库,但是libxml
和expat
在开始使用itI之前需要做大量的准备工作。我需要linux。我将看一看tinyXML。谢谢!您的示例非常好!对我来说非常有用