Xerces C++
学习笔记
1.
初始化平台:
XMLPlatformUtils::Initialze()
2.
销毁平台:
XMLPlatformUtils::Terminate();
3.
加载分析报文
XercesDOMParser *parser = new XercesDOMParser();
Parser->parse(
参数
);
这个参数可以直接是文件名,也可以是内存的数据,具体的查看
API
4.
数据格式转换
XMLString.transcode()
这个方法有多个重载,既可以把
XMLCh *
格式的数据转换成
char *
的数据,也可以把
char *
的数据转换成
XMLCh *,
我们也可以利用这个函数来初始化
XMLCh
格式类型的数组,比如
XMLCh temp[100];
XMLString.transcode(“LS”,temp,99);//
用“
LS
”初始化
temp
这个数组的内容。
5.
分析报文后,如何得到文档的树型结构
DOMDocument *xmlDoc = parser->getDocument();
6.
得到树型结构后,如何得到第一个根节点
DOMElement *root = xmlDoc->getDocumentElement();
7.
如何遍历文档的结构
遍历一个树型的文档结构有三种方法。
1
.使用
DOMNodeIterator
类
DOMNodeIterator *iterator = xmlDoc->createNodeIterator(root, DOMNodeFilter::SHOW_TEXT, NULL, true);
for ( DOMNode * current = (DOMNode *)iterator->nextNode(); current != 0; current = (DOMNode *)iterator->nextNode() )
{
string strValue = XMLString::transcode(current->getNodeValue());
std::cout <<strValue<<endl;
}//
以上就可以把
xml
文档中的属性为
NODETEXT
节点的内容给打印出来。
2
.使用
DOMTreeWalker
类
D
OMTreeWalker *walker = xmlDoc->createTreeWalker(root, DOMNodeFilter::SHOW_TEXT, NULL, true);
f
or (DOMNode *current = walker->nextNode(); current != 0; current = walker->nextNode() )
{
char *strValue = XMLString::transcode( current->getNodeValue() ); std::cout <<strValue;
XMLString::release(&strValue);
}
3
.使用子节点直接遍历树型结构
DOMNode *n = (DOMNode*)xmlDoc->getDocumentElement();
//
下面开始遍历这个树的结构
if(n)
{
if (n->getNodeType() == DOMNode::ELEMENT_NODE)
{
DOMNodeList* nodeList = n->getChildNodes();
unsigned int nListLen = nodeList->getLength();
for (unsigned int i=0; i<nListLen; ++i)
{
DOMNode* nodeTemp = nodeList->item(i);
if (nodeTemp->getNodeType() == DOMNode::ELEMENT_NODE)
{
for (DOMNode* node1=nodeTemp->getFirstChild(); node1!=0; node1=node1->getNextSibling())
{
char* name = XMLString::transcode(node1->getNodeName());
string strTemp = name;
if (strTemp == "name") //
这个就是跟
xml
文档中
name
节点匹配
{
char* myname=XMLString::transcode(node1->getFirstChild()->getNodeValue());
cout<<myname<<endl;
}
}
}
continue;
}
}
}
8.
如何添加子节点。
//Add new (empty) Element to the root element
DOM_Element parentNode = …;// parent is known
DOM_Element prodElem = doc->createElement (tagName);
parentNode->appendChild (prodElem);
9.
在加载
xml
文件分析前,有两种加载方式:一种直接通过文件加载,一种是通过内存加载
1.
String xmlfile = “a.xml”;
Parser->parse(xmlfile.c_str());
2.MemBufInputSource
这个类处理内存的数据,然后利用
parser->parse(*men)//men
是
MemBufInputSource
的实例指针对象。
10.
在加载分析报文前,可以设置
XercesDOMParser
的一些属性。
P
arser->setValidationScheme( XercesDOMParser::Val_Auto );
Parser->setDoNamespaces( false );
Parser->setDoSchema( false );
Parser->setLoadExternalDTD( false );
//
这个部分的代码可以参照类库自带的例子。
11.
我们也可以设置错误的处理代码。
这部分可以查看类库下的
DOMPrint
例子。
DOMError ,DOMErrorHandler
12.
也可以设置分析过滤的属性
DOMNodeFilter
这个类能起到这个效果
13.
要美化文档的格式化输出,我们可以使用
XMLFormatter XMLFormatTarget ,
用的时候可以查看。
14
我们也可以通过
DOMImplementationLs , DOMImplementation
前者是后者的基类。通过这个类我们可以创建
DOMBuilder
(
parser
)或
DOMWriter
(序列,既可以写到屏幕,也可以写到文件)