/*
* ===========================================================================
*
* Filename: ParseXML.cpp
*
* Description: This is an example of the use of Xerces-C++ operation XML.
*
* Version: 1.0
* Created: 03/01/2010 09:44:19 AM
* Revision: none
* Compiler: gcc
*
* Author: huabo (caodaijun), caodaijun@feinno.com
* Company: feinno
*
* ===========================================================================
*/
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
#include <xercesc/framework/MemBufFormatTarget.hpp>
#include <xercesc/framework/StdOutFormatTarget.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <string>
#if defined(XERCES_NEW_IOSTREAMS)
#include <iostream>
#else
#include <iostream.h>
#endif
XERCES_CPP_NAMESPACE_USE
class XStr
{
public:
XStr(const char* const toTranscode)
{
fUnicodeForm = XMLString::transcode(toTranscode);
}
~XStr()
{
XMLString::release(&fUnicodeForm);
}
const XMLCh* unicodeForm() const
{
return fUnicodeForm;
}
private:
XMLCh* fUnicodeForm;
};
#define X(str) XStr(str).unicodeForm()
std::string xml_string =
"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><corporation xmlns='com:cmcc:corporation' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='com:cmcc:corporation corporation.xsd'><eid>100000</eid><basic><corp_name>abcd</corp_name><corp_code/><c0/><short_name/><calling_code/><legal_representative/><address/><zip/><telephone/><fax/><contact/><proportion_code/><logo_crc/><employee_portrait_crc/><group_portrait_crc/><createtime/><opentime/><province_code/><vgop_code/><org_version/><source_code/><client_dept_version/><version_id/><contact_mp/></basic><rules><order_flag/><demo_flag/><useroperate_limit/><emp_portrait_flag/><iplmt/><dept_auth_switch/><sms_block/><sms_begin/><sms_end/><edit_status/><expire_time/></rules><accounts><scale_code/><customer_manager/><manager_phone/><deposit_bank/><bank_accounts/><password_paper_id/><group_code/><sms_code/><meeting_code/><fee_code/><cycle_code/><sharedisk_code/><sp_status/><updatetime/></accounts></corporation>";
std::string basic_string = "<basic><test>good</test></basic>";
int main(int argC, char*argV[])
{
// Initialize the XML4C2 system.
try
{
XMLPlatformUtils::Initialize();
}
catch(const XMLException& toCatch)
{
char *pMsg = XMLString::transcode(toCatch.getMessage());
XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n"
<< " Exception message:"
<< pMsg;
XMLString::release(&pMsg);
return 1;
}
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(X("LS"));
DOMLSSerializer* theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer();
DOMLSOutput *theOutputDesc = ((DOMImplementationLS*)impl)->createLSOutput();
MemBufFormatTarget* target = new MemBufFormatTarget();
theOutputDesc->setByteStream(target);
if (impl != NULL)
{
try
{
XercesDOMParser* parser = new XercesDOMParser();
MemBufInputSource* xml_mem = new MemBufInputSource(
(const XMLByte* )xml_string.c_str(),
xml_string.length(),
"xml",
false);
parser->parse( *xml_mem );
DOMDocument* xml_doc = parser->getDocument();
DOMElement* xml_root = xml_doc->getDocumentElement();
if (NULL == xml_root)
{
std::cout<< "Empty XML document!\n";
exit(1);
}
//输出整个文档
std::cout<< XMLString::transcode(theSerializer->writeToString((DOMNode* )xml_root))<< std::endl;
//输出XPATH指定的结点
DOMXPathNSResolver* resolver = xml_doc->createNSResolver(xml_root);
DOMXPathResult* result = xml_doc->evaluate(
X("/corporation/basic"),
xml_root,
resolver,
DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE,
NULL);
result->snapshotItem(0);
DOMNode* curentNode = result->getNodeValue();
DOMNode* prevNode = curentNode->getParentNode();
theSerializer->write(curentNode, theOutputDesc);
std::cout<< target->getRawBuffer()<< std::endl;
//replace the basic child
MemBufInputSource* basic_mem = new MemBufInputSource(
(const XMLByte* )basic_string.c_str(),
basic_string.length(),
"basic",
false);
parser->parse( *basic_mem );
DOMDocument* basic_doc = parser->getDocument();
DOMElement* basic_root = basic_doc->getDocumentElement();
DOMNode* newnode = xml_doc->importNode((DOMNode* )basic_root, true);
prevNode->replaceChild(newnode, curentNode);
//再次输出整个文档
std::cout<< XMLString::transcode(theSerializer->writeToString((DOMNode* )xml_root))<< std::endl;
delete basic_mem;
delete xml_mem;
delete target;
delete parser;
result->release();
resolver->release();
theOutputDesc->release();
theSerializer->release();
}
catch(const OutOfMemoryException&)
{
XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl;
}
catch (const DOMException& e)
{
XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl;
}
catch (...)
{
XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl;
}
}
else
{
XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl;
}
XMLPlatformUtils::Terminate();
return 0;
}
相关推荐
Xerces-C++是Apache软件基金会的一个重要项目,它是一款高效且可移植的XML文档解析器,支持多种编程语言,其中包括我们这里的焦点——C++。标题中的"xerces-c-3.2.3.zip"指示的是Xerces-C++的3.2.3版本,专为64位...
Xerces-C++ 的前身是 IBM 的 XML4C 项目。XML4C 和 XML4J 是两个并列的项目,而 XML4J 是 Xerces-J——Java 实现——的前身。IBM 将这两个项目的源代码让与 Apache 软件基金会(Apache Software Foundation),他们将...
Xerces-C++是一个开源的XML解析器,它实现了W3C的DOM、SAX和XML Schema接口,用于处理XML文档。 描述中提到的"Xerces-c linux gcc_3_4编译生成dll"可能是指另一个版本的Xerces-C++,这个版本是在Linux环境下,使用...
Xerces-C++ 的前身是 IBM 的 XML4C 项目。XML4C 和 XML4J 是两个并列的项目,而 XML4J 是 Xerces-J——Java 实现——的前身。IBM 将这两个项目的源代码让与 Apache 软件基金会(Apache Software Foundation),他们将...
xerces-c-3.0.0 编译好的库,可以直接... 这两个项目是 Apache XML 组的核心项目(如果看到的是“Xerces-C”而不是“Xerces-C++”,也是同一个东西,因为这个项目一开始就是用 C(译者注:原文为C++)语言编写的)。
2. DOM Level 3支持:Xerces-C++ 2.8.0包含了W3C DOM Level 3的部分实现,详情请查看文档DOM Level 3 Support。 3. 访问DOM API:在程序代码中访问DOM API需要包含头文件,其中包含了DOM API类所需要的全部头文件。...
Xerces-C++,这个在软件开发领域中被广泛使用的开源库,版本号3.1.1,是处理XML文档的强大工具,尤其在Ambulant项目中发挥了重要作用。它的主要功能是解析XML文档,将XML数据转换为程序可以操作的对象,同时也支持...
Xerces-C++是Apache软件基金会开发的一个开源XML解析库,它实现了W3C的DOM(文档对象模型)、SAX(简单API for XML)和XInclude规范。在这个特定的版本“xerces-c-3.2.3.tar.gz”中,我们看到的是一个针对C++编程...
总的来说,Xerces-C++是Linux开发者处理XML文档的强大工具,它的高效、稳定和易用性使其成为XML解析领域的首选库之一。通过深入理解和熟练运用,开发者可以构建出高效、可靠、适应性强的XML处理应用程序。
1. DOM解析:Xerces-C++ 提供了完整的DOM实现,允许开发者以树形结构来表示XML文档,方便进行遍历和修改。 2. SAX解析:SAX是一种事件驱动的解析方式,它在解析过程中触发一系列事件,如元素开始、结束等,适合处理...
- **DOM(Document Object Model)**: Xerces-C++实现了W3C DOM Level 2 Core和Level 3 Core规范,提供了一种树型结构来表示XML文档,使得开发者可以方便地遍历、修改或创建XML文档。 - **SAX(Simple API for XML...
**Xerces-C++** 是一个开源的XML解析器,主要用C++语言编写,它提供了强大的XML处理功能,使得开发者能够有效地解析、验证和操作XML文档。Xerces-C++ 的设计目标是实现高性能、可移植性以及遵循W3C的XML规范。 **...
而Xerces-C++则是实现XML解析的关键工具,它能够将XML文档转换成易于处理的数据结构,使开发者可以轻松地访问和操作XML文档中的内容。 Xerces-C++ 2.0版是该库的一个早期但稳定版本,支持XML 1.0规范。它包含了完整...
2. **DOM模型**:在Xerces-C++ 3.1.3中,支持Document Object Model(DOM)接口,这是一种将整个XML文档加载到内存中的树形结构,允许开发者通过节点关系遍历和修改XML文档。DOM提供了对XML的随机访问能力,适合处理...
C++与"Xalan"标签的关联可能源于它们都是Apache软件基金会的项目,Xalan是一个XPath和XSLT处理器,与Xerces-C++结合,可以实现完整的XML处理流程:从XML解析到XPath查询,再到XSLT转换,生成新的XML或HTML文档。...
Xerces-C++的强大之处在于其对XML标准的全面支持,包括DTD、XML Schema、命名空间、实体引用、XPath和XSLT等。它还提供了多种解析模式,如SAX(Simple API for XML)和DOM(Document Object Model),满足不同性能和...
Xerces-C++是Apache软件基金会开发的一个纯C++实现的XML解析器,它基于SAX(Simple API for XML)和DOM(Document Object Model)两种解析模式,能够高效地处理XML文档。Xerces-C++ 2.6.0版本是本文讨论的重点,该...
而Xerces-C++则是Apache软件基金会开发的一款开源、跨平台的XML解析器,它为C++开发者提供了一套强大的工具来处理XML文档。本文将深入探讨Xerces-C++的特性、工作原理以及其在Apache项目中的应用。 首先,Xerces-...
Xerces-C++是一个强大的XML解析库,它为开发者提供了处理XML文档的高效工具。在处理大型XML数据时,内存管理显得尤为重要,因为它直接影响到程序的性能和稳定性。本篇将深入探讨Xerces-C++中的内存管理机制,以及...