我有需要解析的XML文档和/或我需要构建XML文档并将它们写入文本(文件或内存).由于C++标准库没有此库,我应该使用什么?
注意:这是一个明确的,C++ - FAQ风格的问题.所以,是的,它与其他人重复.我不是简单地适应其他问题,因为他们倾向于要求更具体的东西.这个问题更通用.
我一直在编写一些代码来从Java中的某些页面获取一些数据,Jsoup是最好的库.但是,不幸的是我必须将整个代码移植到C/C++.但是我找不到在c ++上使用的任何体面的html解析器.是否有类似Jsoup的C++库或者如何实现类似的结果?
[目前我正在使用Curl获取页面的来源并漫游互联网以查找html解析器]
我需要解析潜在的巨大XML文件,所以我猜这会排除DOM解析器.
有没有适合C++的轻量级SAX解析器,与足迹上的TinyXML相比?XML的结构非常简单,不需要像名称空间和DTD这样的高级内容.只是元素,属性和cdata.
我知道Xerces,但它超过50mb的超大尺寸让我颤抖.
谢谢!
哪些层有助于有效实现这一目标?优选地,这样我能够将下面列出的这三个组件与早期层一起使用,并且在我去的时候对其余组件进行编码.
我正在编写一个COLLADA加载库,用于我的图形引擎.所以当然我一开始就注意到这似乎是一项相当大的任务.我现在打算编写库来使用不同的层.
我不还明白COLLADA.我假设可能有:
即使这些我不确定,也可能需要成为不同类型的分层方案的一部分.
UPD我已经找到答案,"格式化"的问题在这里,所以我删除了这部分的质询,请阅读最新的问题:
我需要在c ++上将xml写入文件系统.我已经学会了这个知识分子.在教程中使用了非常简单的xml.我的xml更复杂,我不知道如何修改代码来生成它.这就是我的代码:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
//<Root>
// <Set Name="1">
// <Field Name="Hello 1"/>
// <Field Name="World 1"/>
// </Set>
// <Set Name="2">
// <Field Name="Hello 2"/>
// <Field Name="World 2"/>
// </Set>
//</Root>
int main(int argc, char* argv[])
{
using boost::property_tree::ptree;
ptree pt;
pt.put("Root.Set.Field", "Hello");
pt.put("Root.Set.Field", "World");
boost::property_tree::xml_writer_settings<char> settings('\t', 1);
write_xml("testXml.xml", pt, std::locale(), settings);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Set>
<Field>World</Field>
</Set>
</Root>
Run Code Online (Sandbox Code Playgroud)
如何修改我的程序以生成所需的xml,特别是:
true
像那样添加pt.put("Root.Set.Field", "Hello", true);
编译时错误 …我们希望在代码的GUI部分中保留一些用户设置.我以前只使用Win32编程,这种方式的典型方法是使用注册表设置.
我假设这应该用配置文件完成,但是想知道是否有一个库或跨平台包装器使得键/值对持久性非常容易.
(不确定这是否应该是CW,如果你认为应该是,你可以发表评论).
在我的工作场所,我们有许多不同的文件格式用于各种目的.大多数(如果不是全部)这些文件格式都是用纯文本编写的,没有一致性.我只是一名兼职工作的学生,我没有在生产中使用xml的经验,但在我看来,使用xml可以提高工作效率,因为我们经常需要解析,检查和比较这些输出.
所以我的问题是:鉴于我只能控制一个小应用程序及其输出(仅 - 输入也是其他应用程序中使用的格式),是否值得尝试将输出更改为基于xml?如果是这样,在C++中有哪些最着名的方法(即xml解析器/编写器等)?另外,我是否还应提供纯文本输出,以方便用户(也是程序员)习惯xml?我应该提供翻译xml-plaintext的脚本吗?你对这个主题有什么经验?
谢谢.
我的XML文件有:
<Package> xmlMetadata </ Package>
我正在此文件中搜索标签,并且必须在控制台上打印此标签的开始和结束标签之间的文本.即在这种情况下,我希望在控制台上打印xmlMetadata.同样,它应该在文件中更进一步,如果它遇到同一文件中的另一个<Package>标记,则再次打印.
这是我的代码,但它是打印整个文件的内容:
{
string line="< Package >";
ifstream myfile (xmlFileName); //xmlFileName is xml file in which search is to done
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
std::cout<<line<< endl;
}
myfile.close();
}
else cout << "Unable to open file";
}
Run Code Online (Sandbox Code Playgroud)
在我的整个xml下面显示:
< ? xml version="1.0" ? >
< fileStructure >
< Main_Package >
File_Navigate
< /Main_Package >
< Dependency_Details >
< Dependency >
< Package >
xmlMetadata
< /Package >
< Header …
Run Code Online (Sandbox Code Playgroud) 我有一个带有原始指针的向量(不,我不能使用智能指针),我想在for循环中将项添加到列表中.我做了一个小试用项目,我想知道这在指针管理方面是否被认为是好的C++代码.
请仅考虑原始指针管理,我对我正在尝试解决的这个特定问题的智能指针不感兴趣.
一个简单的对象:
class Request
{
public:
std::string name;
};
std::vector<Request*> requests;
for (int i = 0; i < 5; i++)
{
std::stringstream ss;
ss << "elemenent ";
ss << i;
std::string s = ss.str();
Request* req = new Request();
req->name = s;
requests.push_back(req);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
所以我想解决的问题是将DOMNode*添加到此库中的向量中.
我开始觉得尝试为我的项目编写一个包含我需要的部件的包装器是一个坏主意.或者图书馆也不好?我没有使用smart_ptr正常工作,如果有人在那里,那么我想听听它.