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,但是当我想编译它时,这些文件会返回错误)

Solutions Collecting From Web of "Xerces C ++ – 加载,读取和保存替代品?"

保存xerces DOMDocument的示例 使用保存文档

 DOMLSSerializer::write(const DOMNode* nodeToWrite, DOMLSOutput* const destination) 

看代码示例http://xerces.apache.org/xerces-c/domprint-2.html

  DOMLSSerializer * theSerializer = impl->createLSSerializer(); DOMPrintFilter *myFilter = new DOMPrintFilter(DOMNodeFilter::SHOW_ELEMENT | DOMNodeFilter::SHOW_ATTRIBUTE | DOMNodeFilter::SHOW_DOCUMENT_TYPE); theSerializer->setFilter(myFilter); DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput(); XMLFormatTarget *myFormTarget = new LocalFileFormatTarget(XMLString::transcode("C:\\target.xml")); theOutputDesc->setByteStream(myFormTarget); theOutputDesc->setEncoding(XMLString::transcode("ISO-8859-1")); theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMXMLDeclaration, true); theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); theSerializer->write(doc, theOutputDesc); myFormTarget->flush(); delete myFormTarget; theOutputDesc->release(); theSerializer->release(); 

以及Filter实现的一个例子。 你可以在DOMPrint例子中找到它。

 class DOMPrintFilter : public DOMLSSerializerFilter { public: DOMPrintFilter(ShowType whatToShow = DOMNodeFilter::SHOW_ALL); ~DOMPrintFilter(){}; virtual FilterAction acceptNode(const DOMNode*) const; virtual ShowType getWhatToShow() const {return fWhatToShow;}; private: // unimplemented copy ctor and assignement operator DOMPrintFilter(const DOMPrintFilter&); DOMPrintFilter & operator = (const DOMPrintFilter&); ShowType fWhatToShow; }; #include "DOMPrintFilter.hpp" #include <xercesc/util/XMLUniDefs.hpp> #include <xercesc/util/XMLString.hpp> static const XMLCh element_person[]= { chLatin_p, chLatin_e, chLatin_r, chLatin_s, chLatin_o, chLatin_n, chNull }; static const XMLCh element_link[]= { chLatin_l, chLatin_i, chLatin_n, chLatin_k, chNull }; DOMPrintFilter::DOMPrintFilter(ShowType whatToShow) :fWhatToShow(whatToShow) {} DOMNodeFilter::FilterAction DOMPrintFilter:: acceptNode(const DOMNode* node) const { // // The DOMLSSerializer shall call getWhatToShow() before calling // acceptNode(), to show nodes which are supposed to be // shown to this filter. // // REVISIT: In case the DOMLSSerializer does not follow the protocol, // Shall the filter honour, or NOT, what it claims // it is interested in ? // // The DOMLS specs does not specify that acceptNode() shall do // this way, or not, so it is up the implementation, // to skip the code below for the sake of performance ... // if ((getWhatToShow() & (1 << (node->getNodeType() - 1))) == 0) return DOMNodeFilter::FILTER_ACCEPT; switch (node->getNodeType()) { case DOMNode::ELEMENT_NODE: { // for element whose name is "person", skip it if (XMLString::compareString(node->getNodeName(), element_person)==0) return DOMNodeFilter::FILTER_SKIP; // for element whose name is "line", reject it if (XMLString::compareString(node->getNodeName(), element_link)==0) return DOMNodeFilter::FILTER_REJECT; // for rest, accept it return DOMNodeFilter::FILTER_ACCEPT; break; } case DOMNode::COMMENT_NODE: { // the WhatToShow will make this no effect return DOMNodeFilter::FILTER_REJECT; break; } case DOMNode::TEXT_NODE: { // the WhatToShow will make this no effect return DOMNodeFilter::FILTER_REJECT; break; } case DOMNode::DOCUMENT_TYPE_NODE: { // even we say we are going to process document type, // we are not able be to see this node since // DOMLSSerializerImpl (a XercesC's default implementation // of DOMLSSerializer) will not pass DocumentType node to // this filter. // return DOMNodeFilter::FILTER_REJECT; // no effect break; } case DOMNode::DOCUMENT_NODE: { // same as DOCUMENT_NODE return DOMNodeFilter::FILTER_REJECT; // no effect break; } default : { return DOMNodeFilter::FILTER_ACCEPT; break; } } return DOMNodeFilter::FILTER_ACCEPT; } 

LibXML ++似乎是C ++中最好的一个。 功能方面,它是非常完整的,包括XPath,字符集转换(由Glibmm)和你期望在XML库中的一切。 它使用传统的DOM和SAX API,根据你的要求,它被视为一个专业或者是一个con。 一个可能的问题是库的依赖性非常大(由于使用Glibmm)。 不过,它似乎是C ++的唯一体面的XML库。

http://libxmlplusplus.sourceforge.net/docs/manual/html/index.html

TinyXML不会根据规范解析XML,所以我会推荐它,尽管它适用于简单的文档。

Xerces附带的示例CreateDOMDocument显示了如何将节点等添加到DOM文档。 你到目前为止的代码创建了文档,所以你需要修改第二个示例中的代码来添加节点,属性等。

另外请注意,当你说:

  cout << docRootNode->getAttributes() << endl; 

getAttributes函数返回属性的集合 – 您需要将更多的Xerces函数应用于该集合以获取包含的信息。

请注意,如果要提取XML文件中的数据子集,可能会更容易使用事件驱动的SAX解析器(Xerces包含其中之一),而不是构建和漫游完整的DOM文档。

如果你想看看如何使用Xerces-C ++来做这个例子,请看下面的代码:

http://libprf1.tigris.org/files/documents/1338/13256/libprf1-0.1R3.tar.gz

我很久以前就写了一个大学项目。 这很可能是基于过时版本的Xerces-C ++,但是我不认为这个API已经改变太多了。 它至少会给你一个想法。

以下链接是一个很好的教程,它显示了如何读取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