c++ builder 中的 XMLDocument 类详解(13) - 遍历XML文件
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <msxmldom.hpp> #include <XMLDoc.hpp> #include <xmldom.hpp> #include <XMLIntf.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *btn_1; TButton *btn_2; TXMLDocument *XMLDocument1; void __fastcall btn_1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <stdio.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- String ReadXml(_di_IXMLNode node) { _di_IXMLNodeList nodeList,attrList; String str,strName,strValue,result; int i; if(!node->HasChildNodes) return ""; attrList=node->AttributeNodes;//根节点属性列表 nodeList=node->ChildNodes; //根节点下的子节点列表 str="<"+node->NodeName; //先读取属性 for(int i=0;i<attrList->Count-1;i++) { strName=attrList->Nodes[i]->Text;//结点名字 strValue=attrList->Nodes[i]->Text; //结点值 str=str+" "+strName+"="+AnsiQuotedStr(strValue,'\"');//AnsiQuotedStr定界符函数 } str=str+">"+sLineBreak;//sLineBreak是常量 //读取子结点 for(int i=0;i<nodeList->Count;i++) { if(nodeList->Nodes[i]->IsTextElement)//如果他是文本结点则读它的数据 { strName=nodeList->Nodes[i]->NodeValue;//结点值 str=str+"<"+strName+">"+strValue+"</"+strName+">"+sLineBreak; } else if(nodeList->Nodes[i]->HasChildNodes)//如果是不是文本结点而且有子结点 { str=str+ReadXml(nodeList->Nodes[i]); str=str+"</"+strName+">"+sLineBreak; } } str=str+"</"+node->NodeName+">";//封口 return str; } //调用测试 void __fastcall TForm1::btn_1Click(TObject *Sender) { String str_an,s1,s2; char str[50]; XMLDocument1->LoadFromFile("D:\\code\\B_C_B\\XMLDocument\\test.xml"); //读取文件 s1=AnsiQuotedStr(XMLDocument1->Version,'"');//读出版本, 并添加双引号 s2=AnsiQuotedStr(XMLDocument1->Encoding,'"');//读出字符集, 并添加双引号 // str=Format("<?xml version=%s encoding=%s?>",s1,s2,2);// sprintf(str,"<?xml version=%s encoding=%s?>",s1,s2);// 这就是头文件了 str_an=AnsiString(str); str_an=str_an+sLineBreak+ReadXml(XMLDocument1->DocumentElement); ShowMessage(str_an);//返回 } //---------------------------------------------------------------------------
本博客注有“转”字样的为转载文章,其余为本人原创文章,转载请务必注明出处或保存此段。c++/lua/windows逆向交流群:69148232