Xerces C++ - 加载、读取和保存,替代方案?
我正在寻找一个教程来加载 XML 文件、读取它、更改它并最终使用 C++ 保存它。我正在使用 Linux Ubuntu 并尝试使用 Xerces。通过 Google 和很多时间,我只能加载 XML 文件:
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace std;
using namespace xercesc;
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
const char* xmlFile = "demo.xml";
try {
parser->parse(xmlFile);
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return -1;
}
DOMNode* docRootNode;
// DOMNode* aNode;
DOMDocument* doc;
doc = parser->getDocument();
docRootNode = doc->getDocumentElement();
cout << docRootNode->getAttributes() << endl; //returns Hex
delete parser;
delete errHandler;
return 0;
}
如何读取和操作 XML 文件并最终保存它?有替代库吗? (我尝试过tinyxml,但当我想编译它时,文件返回错误)
I'm searching for a tutorial to load a XML file, read it, change it and finally save it with C++. I'm using Linux Ubuntu and tried to use Xerces. With Google and much time, I could only load an XML File:
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <iostream>
using namespace std;
using namespace xercesc;
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
const char* xmlFile = "demo.xml";
try {
parser->parse(xmlFile);
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return -1;
}
DOMNode* docRootNode;
// DOMNode* aNode;
DOMDocument* doc;
doc = parser->getDocument();
docRootNode = doc->getDocumentElement();
cout << docRootNode->getAttributes() << endl; //returns Hex
delete parser;
delete errHandler;
return 0;
}
How do I can read an manipulate the XML file and finally save it? Is there alternative libraries? (I tried tinyxml but the files returns errors, when I want to compile it)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
保存 xerces DOMDocument 的示例。使用代码保存文档
示例 http://xerces.apache.org/xerces- c/domprint-2.html
以及 Filter 实现的示例。您可以在 DOMPrint 示例中找到它。
A Sample for Saving xerces DOMDocument. Saving a Document with
see code Example http://xerces.apache.org/xerces-c/domprint-2.html
And a example for Filter implementation. You can find this in DOMPrint example.
LibXML++ 似乎是 C++ 的最佳选择。从功能角度来看,它非常完整,包括 XPath、字符集转换(由 Glibmm 提供)以及 XML 库中您期望的所有内容。它使用传统的 DOM 和 SAX API,这是否有利取决于您向谁询问。一个可能的问题是该库的依赖性非常重(由于使用了 Glibmm)。尽管如此,它似乎是唯一适合 C++ 的 XML 库。
http://libxmlplusplus.sourceforge.net/docs/manual/html/index.html html
TinyXML 不会根据规范解析 XML,因此我建议不要使用它,即使它适用于简单文档。
LibXML++ appears to be the best one for C++. Feature-wise it is very complete, including XPath, charset conversions (by Glibmm) and everything that you'd expect in an XML library. It uses traditional DOM and SAX APIs, which counts as a pro or a con depending on whom you ask from. One possible issue is that the dependencies of the library are extremely heavy (due to the use of Glibmm). Still, it appears to be the only decent XML library for C++.
http://libxmlplusplus.sourceforge.net/docs/manual/html/index.html
TinyXML does not parse XML according to the specification, so I would recommend against it, even though it works for simple documents.
Xerces 附带的示例 CreateDOMDocument 向您展示了如何将节点等添加到 DOM 文档。到目前为止,您拥有的代码创建了文档,因此您需要调整第二个示例中的代码以添加节点、属性等。
另外,请注意,当您说:
getAttributes 函数返回属性集合时 - 您需要进一步应用Xerces 函数作用于该集合以获取所包含的信息。
请注意,如果您想要提取 XML 文件中的数据子集,那么使用事件驱动的 SAX 解析器(Xerces 包括其中之一)可能比构建和遍历完整的 DOM 文档更容易。
The sample CreateDOMDocument that comes with Xerces shows you how to add nodes etc. to a DOM document. The code you have so far creates the document, so you need to adapt the code in the second sample to add nodes, attributes etc.
Also, note that when you say:
the getAttributes function returns a collection of attributes - you need to apply further Xerces functions to that collection to get the contained information.
Note that if you want to extract a subset of the data in in e XML file, it may be easier to use an event driven SAX parser (Xerces includes one of these) rather than building and walking a complete DOM document.
如果您想查看如何使用 Xerces-C++ 执行此操作的示例,请查看以下代码:
http://libprf1.tigris.org/files/documents/1338/13256/libprf1-0.1R3.tar.gz
我很久以前写的大学项目。它很可能基于 Xerces-C++ 的过时版本,但我不认为 API 变化太大而成为问题。它至少会给你一个想法。
If you want to see an example of how to do that using Xerces-C++, check out this code:
http://libprf1.tigris.org/files/documents/1338/13256/libprf1-0.1R3.tar.gz
I wrote it a long time ago as a university project. It's most likely based on an outdated version of Xerces-C++, but I don't think the API has changed too much to be a problem. It will at least give you an idea.
以下链接是一个很好的教程,展示了如何读取 XML 文件并使用 XERCES 解析它的基础知识。
http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html
完成后,XERCES API 应该足以进行进一步的操作:
http://xerces.apache.org/xerces-c/apiDocs-2/classes.html
要写入(序列化)文档,请使用 DOMWriter 类
http://xerces.apache.org/xerces-c/apiDocs -2/classDOMWriter.html#a0ddcef5fed6b49e03e53334fedca4b2
The following link is a good tutorial that show basics for how to read an XML file and parse it with XERCES.
http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html
When that is done, the XERCES API should be enough for further operations:
http://xerces.apache.org/xerces-c/apiDocs-2/classes.html
For writing (serialize) the document, user the class DOMWriter
http://xerces.apache.org/xerces-c/apiDocs-2/classDOMWriter.html#a0ddcef5fed6b49e03e53334fedca4b2