XML换行

来源:互联网 发布:医院网络推广,网络营销 编辑:程序博客网 时间:2024/06/05 00:16

pKCXML.CreateInstance(__uuidof(MSXML2::DOMDocument40))

pDocElement->appendChild(pDoc->createTextNode("\n\t")); 

 pDocElement->appendChild(pNewChildElement);

1、XML换行实现

CoInitialize(NULL);


 MSXML2::IXMLDOMDocumentPtr pDoc = NULL; 
 MSXML2::IXMLDOMElementPtr xmlRoot = NULL; 
 MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL; 
 //创建DOMDocument对象 
 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); 
 if(!SUCCEEDED(hr)) 
 { 
    MessageBox(L"无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 
 return TRUE; 
 } 
 pPI = pDoc->createProcessingInstruction("xml","version='1.0' encoding='gb2312'"); 
 _variant_t vNullVal; 
 vNullVal.vt = VT_NULL; 
 pDoc->insertBefore(pPI, vNullVal); 


 //根节点的名称为Book 
 //创建元素并添加到文档中 
 xmlRoot=pDoc->createElement((_bstr_t)"Banks"); 
 //设置属性 
 pDoc->appendChild(xmlRoot); 


 AppendTextNode(pDoc,xmlRoot,_T("\r\n\t"));


 //添加“author”元素 
 MSXML2::IXMLDOMElementPtr pNode; 
 pNode=pDoc->createElement((_bstr_t)"Bank"); 
 xmlRoot->appendChild(pNode); 


 AppendTextNode(pDoc,pNode,_T("\r\n\t\t"));


 MSXML2::IXMLDOMElementPtr pNode2; 
 pNode2=pDoc->createElement((_bstr_t)"Head"); 
 pNode->appendChild(pNode2); 


 AppendTextNode(pDoc,pNode2,_T("\r\n\t\t\t"));


 MSXML2::IXMLDOMElementPtr pNode3; 
 pNode3=pDoc->createElement((_bstr_t)"PBCCode"); 
 pNode3->Puttext("局势"); 
 pNode2->appendChild(pNode3);


 AppendTextNode(pDoc,pNode2,_T("\r\n\t\t\t"));


 pNode3=pDoc->createElement((_bstr_t)"Code"); 
 pNode3->Puttext("局势"); 
 pNode2->appendChild(pNode3);


 ///////////////////////////////////////////////////
 AppendTextNode(pDoc,pNode2,_T("\r\n\t\t"));
 //////////////////////////////////////////////////////
 AppendTextNode(pDoc,pNode,_T("\r\n\t\t"));


 pNode2=pDoc->createElement((_bstr_t)"Table1"); 
 pNode->appendChild(pNode2); 


 AppendTextNode(pDoc,pNode2,_T("\r\n\t\t\t"));


 pNode3=pDoc->createElement((_bstr_t)"PBCCode"); 
 pNode3->Puttext("局势"); 
 pNode2->appendChild(pNode3);


 AppendTextNode(pDoc,pNode2,_T("\r\n\t\t\t"));


 pNode3=pDoc->createElement((_bstr_t)"Code"); 
 pNode3->Puttext("局势"); 
 pNode2->appendChild(pNode3);


 ///////////////////////////////////////////////////
 AppendTextNode(pDoc,pNode2,_T("\r\n\t\t"));
 //////////////////////////////////////////////////////


 AppendTextNode(pDoc,pNode,_T("\r\n\t"));
 AppendTextNode(pDoc,xmlRoot,_T("\r\n"));




 pDoc->save("C:\\he.xml"); 


 CoUninitialize();


2、XPATH理解和实现
最近在解析XML字符串时,碰到一个很奇怪的问题,经过一番周折总算找到了答案。在此做个小总


结,这也是我写博客的目的之一:将平时开发中总结的小知识点记录下来,以备以后查阅。
 
    先给出一个会出问题的XML示例(自己随便从一个VC工程的.vcproj文件里面截出来的):
   
    <?xml version="1.0" encoding="gb2312"?>
    <VisualStudioProject>
    <files>
    <File Path=".\config.cpp"/>
    <File Path=".\config.h"/>
    <File Path=".\main.cpp"/>
    </files>
    </VisualStudioProject>
 
    可以看到在Xpath路径“VisualStudioProject/files”下有三个“File”兄弟节点,如果现在


要对这三个节点进行处理的话,可能我们的做法是这样的:
 
    MSXML2::IXMLDOMNodePtr pNode = pDocumentNode->selectSingleNode(_bstr_t


(L"VisualStudioProject/files/File"));
    while(pNode)
    {
         …  // process node
         pNode = pNode->nextSibling;
    }
 
    看似没有问题的代码,实际运行的话会发生异常。在XML DOM的标准规范中,nextSibling属性


返回某个元素之后紧跟的元素(处于同一树层级)。同时规范提示:Internet Explorer会忽略节


点间生成的空白文本节点(例如,换行符号),而 Mozilla 不会这样做。也就是说,对于换行符


等空白文本节点,有可能会被理解为是一个节点。
    通过实例验证,MSXML2接口会将换行符看成一个节点。因此,上面代码的process node过程会


对一个换行符进行处理,导致异常。我们需要在每次处理之前判断一下节点类型,即:
 
    MSXML2::IXMLDOMNodePtr pNode = pDocumentNode->selectSingleNode(_bstr_t


(L"VisualStudioProject/files/File"));
    while(pNode)
    {
        if( pNode->nodeType != NODE_ELEMENT)
         {
             …  // process node
        }
         pNode = pNode->nextSibling;
    }
 
    这个问题如果不加注意的话还是很容易引起麻烦的,因为那个换行符之类的空白文本节点不是


那么引人注目。另外,还有一种方法可以完成我们需要的处理:
 
    MSXML2::IXMLDOMNodeListPtr pNodeList = pDocumentNode->selectNodes(_bstr_t


(L"VisualStudioProject/files/File"));
    if( pNodeList)
    {
        for( long i = 0; i < pNodeList->length; ++i)
        {
            MSXML2::IXMLDOMNodePtr pNode = pNodeList->item[i];
             …  // process node
        }
    }


3、换行另外一种方法
#import "MSXML6.dll" named_guids
using namespace MSXML2 ;


HRESULT hr =


   m_spXmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60 ),


     NULL ,CLSCTX_INPROC);
原创粉丝点击