Borland C++ Builder 6.0 XML處理總結

來源:互聯網
上載者:User

Borland C++ Builder 6.0 XML處理總結
1、安裝
C++ Builder對於XML處理主要封裝在TXMLDocument組件中,該組件是Internet組件的一部分。
如果在安裝包有已經有Borland Internet Components組件,那表示已經可以使用
TXMLDocument控制項了。該控制項在Internet控制卡中,筆者的在最後一個,表徵圖為標識有XML
的文檔式樣。如果沒有該控制項的話,你需要安裝。
TXMLDocument不是C++ Builder預設安裝的包,需要自己添加安裝包。如果在C++ Builder
目錄的Bin目錄下存在dclnet60.bpl檔案,就直接安裝就是,否則需要修改安裝,以安裝該
組件包。

2、使用
2.1 基本操作
2.1.1 使用控制項方式載入XML檔案樣本:
//載入XML檔案<br /> OpenDialog1->Filter = "XML(程式設定檔)|*.xml";<br /> if (!OpenDialog1->Execute()){<br /> return;<br /> }</p><p> XMLDoc->LoadFromFile(OpenDialog1->FileName);<br /> _di_IXMLNode node = XMLDoc->DocumentElement;<br /> if (node == NULL){<br /> ShowMessage("不是合法的程式設定檔XML檔案格式。");<br /> return;<br /> }<br />
2.1.2 使用控制項方式儲存XML檔案樣本:

SaveDialog1->FileName = FDevTypeName + ".xml";<br /> SaveDialog1->Filter = "XML(程式設定檔)|*.xml";<br /> if (SaveDialog1->Execute()){<br /> XMLDoc->Active=true;<br /> XMLDoc->Version = "1.0";<br /> XMLDoc->Encoding = "GB2312";<br /> XMLDoc->Options << doNodeAutoIndent;<br /> //建立文檔主要元素<br /> XMLDoc->DocumentElement = XMLDoc->CreateElement("Config", "");<br /> XMLDoc->DocumentElement->SetAttribute("DevType", FDevTypeName);<br /> //從UI更新XML資料<br /> UpdateXMLDataFromUI(XMLDoc->DocumentElement);<br /> //格式化XML<br /> XMLDoc->LoadFromXML(formatXMLDoc(XMLDoc, 1));<br /> //儲存XML檔案<br /> XMLDoc->SaveToFile(SaveDialog1->FileName);<br /> ShowMessage("儲存配置"+ SaveDialog1->FileName + "檔案成功");<br /> }<br />     
2.2 讀
2.2.1 讀取節點資料

AnsiString GetNodeData(_di_IXMLNode panode,<br /> AnsiString nodename, AnsiString defaultvalue)<br /> {<br /> //取得子節點列表<br /> _di_IXMLNodeList nodes = panode->ChildNodes;<br /> //從子節點列表尋找節點<br /> _di_IXMLNode node = nodes->FindNode(nodename);<br /> if (node == NULL){<br /> return defaultvalue;<br /> }<br /> //從節點取得資料<br /> return node->GetText();<br /> }
2.2.1 讀取節點屬性
//在格式描述XML檔案中定位列描述<br /> nodename = "grid";<br /> _di_IXMLNode uinode = XMLUI->DocumentElement;<br /> _di_IXMLNodeList uinodelst = uinode->ChildNodes;<br /> uinode = uinodelst->FindNode(nodename);<br /> uinodelst = uinode->ChildNodes;</p><p> for (jdx = 0; jdx < uinodelst->Count; jdx++){<br /> //取得當前列在表格中的位置<br /> colname = uinodelst->Nodes[jdx]->GetText();<br /> //設定列頭<br /> colheader = colname + "(" + uinodelst->Nodes[jdx]->GetAttribute("length") ;</p><p> //根據類型設定表格列類型,用於編輯<br /> //取得節點屬性樣本<br /> if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Hex")){<br /> colheader += ", Hex";<br /> }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("DevType")){<br /> }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Baud")){<br /> }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Integer")){<br /> colheader += ", Dec";<br /> }else{<br /> colheader += ", Dec";<br /> }<br /> colheader += ")";</p><p> //...(省略)<br /> }//~for(jdx...<br />
2.3 寫
以下代碼示範了如果添加子節點,以及設定屬性,寫XML檔案在第1節點有所描述。
void UpdateNodeData(_di_IXMLNode panode,<br /> AnsiString nodename, AnsiString value, AnsiString friendlyname)<br /> {<br /> _di_IXMLNodeList nodes = panode->ChildNodes;<br /> _di_IXMLNode node = nodes->FindNode(nodename);<br /> if (node == NULL){<br /> //添加子節點<br /> node = panode->AddChild(nodename);<br /> //設定屬性<br /> node->SetAttribute("FriendlyName", friendlyname);<br /> }<br /> //改變節點資料<br /> node->SetText(value);<br /> }
2.4 格式化XML
以上代碼為格式化XML,調用方式在寫XML在2.1.2節中有描述。使用該組件的縮排方式直接
通過寫入節點方式並不能得到格式化文檔,當載入一個檔案時可以自動格式化。一種簡單的
格式化方式就是先儲存好檔案再讀取一次,再儲存就可以得到格式化的文檔。

//聲明:該代碼源於網路,並做了些修改<br />//---------------------------------------------------------------------------<br />//格式化XML文檔<br />//---------------------------------------------------------------------------<br />AnsiString formatXMLDoc(TXMLDocument* doc, int indent)<br />{</p><p> AnsiString sRes;<br /> int i;<br /> sRes = "<?xml version=/"" + doc->Version + "/" encoding=/"" + doc->Encoding + "/"?>/r/n";<br /> sRes += "<" + doc->DocumentElement->NodeName;<br /> for (i = 0; i < doc->DocumentElement->AttributeNodes->Count; i++)<br /> {<br /> sRes += " " + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeName<br /> + "=/"" + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeValue + "/"";<br /> }<br /> sRes += ">/r/n";</p><p> for (i = 0; i < doc->DocumentElement->ChildNodes->Count; ++i){<br /> sRes += formatXMLNode(doc->DocumentElement->ChildNodes->Nodes[i], indent);<br /> }<br /> sRes += "</" + doc->DocumentElement->NodeName + ">/r/n";<br /> return sRes;<br />}</p><p>AnsiString formatXMLNode(_di_IXMLNode element, int indent)<br />{</p><p> AnsiString sBlank = "";<br /> AnsiString sRes = "";<br /> int i;<br /> for (i = 0; i < indent; ++i){<br /> sBlank += " ";<br /> }</p><p> if (element->NodeType == ELEMENT_NODE<br /> && element->ChildNodes && element->ChildNodes->Count > 0<br /> && element->ChildNodes->Nodes[0]->NodeType != TEXT_NODE)<br /> {<br /> sRes = sBlank + '<'+element->NodeName;<br /> for (i = 0; i < element->AttributeNodes->Count; i++)<br /> {<br /> sRes += " " + element->AttributeNodes->Nodes[i]->NodeName<br /> + "=/"" + element->AttributeNodes->Nodes[i]->NodeValue + "/"";<br /> }<br /> sRes += ">/r/n";<br /> indent++;<br /> for (i = 0; i < element->ChildNodes->Count; i++)<br /> {<br /> sRes += formatXMLNode(element->ChildNodes->Nodes[i], indent);<br /> }<br /> sRes += sBlank + "</" + element->NodeName + ">/r/n";<br /> }<br /> else if (element->NodeType != PROCESSING_INSTRUCTION_NODE)<br /> {<br /> sRes += sBlank + element->XML + "/r/n";<br /> }<br /> return sRes;<br />}</p><p>

3、注意事項
以上描述的方式是通過XML控制項方式來操作XML文檔。在使用對象方式操作XML檔案時,需要注意一些問題。
在載入一個檔案時,不需要建立一個TXMLDocument對象(TXMLDocument *myxml = new TXMLDocument()),
而是使用_di_IXMLDocument介面。從檔案載入XML檔案是使用LoadXMLDocument來獲得該介面的執行個體。操作
一個空的XML文檔並開始寫時也是使用該介面NewXMLDocument獲得該介面。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.