Borland C++ Builder 6.0 XML处理总结

来源:互联网 发布:购买的淘宝店铺安全吗 编辑:程序博客网 时间:2024/06/07 00:33

Borland C++ Builder 6.0 XML处理总结
转自:http://blog.csdn.net/yin138/article/details/5691358#comments

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文件示例:

[cpp] view plaincopy
  1.        //加载XML文件  
  2.        OpenDialog1->Filter = "XML(程序配置文件)|*.xml";  
  3. if (!OpenDialog1->Execute()){  
  4.                return;  
  5.        }  
  6.   
  7.        XMLDoc->LoadFromFile(OpenDialog1->FileName);  
  8.        _di_IXMLNode node = XMLDoc->DocumentElement;  
  9.        if (node == NULL){  
  10.                ShowMessage("不是合法的程序配置文件XML文件格式。");  
  11.                return;  
  12.        }  

2.1.2 使用控件方式保存XML文件示例:

[cpp] view plaincopy
  1. SaveDialog1->FileName = FDevTypeName + ".xml";  
  2.         SaveDialog1->Filter = "XML(程序配置文件)|*.xml";  
  3.         if (SaveDialog1->Execute()){  
  4.                 XMLDoc->Active=true;  
  5.                 XMLDoc->Version = "1.0";  
  6.                 XMLDoc->Encoding = "GB2312";  
  7.                 XMLDoc->Options << doNodeAutoIndent;  
  8.                 //建立文档主元素  
  9.                 XMLDoc->DocumentElement = XMLDoc->CreateElement("Config""");  
  10.                 XMLDoc->DocumentElement->SetAttribute("DevType", FDevTypeName);  
  11.                 //从UI更新XML数据  
  12.                 UpdateXMLDataFromUI(XMLDoc->DocumentElement);  
  13.                 //格式化XML  
  14.                 XMLDoc->LoadFromXML(formatXMLDoc(XMLDoc, 1));  
  15.                 //保存XML文件  
  16.                 XMLDoc->SaveToFile(SaveDialog1->FileName);  
  17.                 ShowMessage("保存配置"+ SaveDialog1->FileName + "文件成功");  
  18.         }  
      
2.2 读
2.2.1 读取节点数据

[cpp] view plaincopy
  1. AnsiString GetNodeData(_di_IXMLNode panode,  
  2.         AnsiString nodename, AnsiString defaultvalue)  
  3. {  
  4.         //取得子节点列表  
  5.         _di_IXMLNodeList nodes = panode->ChildNodes;  
  6.         //从子节点列表查找节点  
  7.         _di_IXMLNode node = nodes->FindNode(nodename);  
  8.         if (node == NULL){  
  9.                 return defaultvalue;  
  10.         }  
  11.         //从节点取得数据  
  12.         return node->GetText();  
  13. }  

2.2.1 读取节点属性
[cpp] view plaincopy
  1. //在格式描述XML文件中定位列描述  
  2.        nodename = "grid";  
  3.        _di_IXMLNode uinode = XMLUI->DocumentElement;  
  4.        _di_IXMLNodeList uinodelst = uinode->ChildNodes;  
  5.        uinode = uinodelst->FindNode(nodename);  
  6.        uinodelst = uinode->ChildNodes;  
  7.          
  8.        for (jdx = 0; jdx < uinodelst->Count; jdx++){  
  9.                //取得当前列在表格中的位置  
  10.                colname = uinodelst->Nodes[jdx]->GetText();  
  11.                //设置列头  
  12.                colheader = colname + "(" + uinodelst->Nodes[jdx]->GetAttribute("length") ;  
  13.          
  14.                //根据类型设置表格列类型,用于编辑  
  15.                //取得节点属性示例  
  16.                if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Hex")){  
  17.                        colheader += ", Hex";  
  18.                }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("DevType")){  
  19.                }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Baud")){  
  20.                }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Integer")){  
  21.                        colheader += ", Dec";  
  22.                }else{  
  23.                        colheader += ", Dec";  
  24.                }  
  25.                colheader += ")";  
  26.                  
  27.                //...(省略)  
  28.        }//~for(jdx...  

2.3 写
以下代码演示了如果添加子节点,以及设置属性,写XML文件在第1节点有所描述。
[cpp] view plaincopy
  1. void UpdateNodeData(_di_IXMLNode panode,  
  2.                AnsiString nodename, AnsiString value, AnsiString friendlyname)  
  3.        {  
  4.                _di_IXMLNodeList nodes = panode->ChildNodes;  
  5.                _di_IXMLNode node = nodes->FindNode(nodename);  
  6.                if (node == NULL){  
  7.                        //添加子节点  
  8.                        node = panode->AddChild(nodename);  
  9.                        //设置属性  
  10.                        node->SetAttribute("FriendlyName", friendlyname);  
  11.                }  
  12.                //改变节点数据  
  13.                node->SetText(value);  
  14.        }  

2.4 格式化XML
以上代码为格式化XML,调用方式在写XML在2.1.2节中有描述。使用该组件的缩进方式直接
通过写入节点方式并不能得到格式化文档,当加载一个文件时可以自动格式化。一种简单的
格式化方式就是先保存好文件再读取一次,再保存就可以得到格式化的文档。

[cpp] view plaincopy
  1. //声明:该代码源于网络,并做了些修改  
  2. //---------------------------------------------------------------------------  
  3. //格式化XML文档  
  4. //---------------------------------------------------------------------------  
  5. AnsiString formatXMLDoc(TXMLDocument* doc, int indent)  
  6. {  
  7.   
  8.         AnsiString sRes;  
  9.         int i;  
  10.         sRes = "<?xml version=/"" + doc->Version + "/" encoding=/"" + doc->Encoding + "/"?>/r/n";  
  11.         sRes += "<" + doc->DocumentElement->NodeName;  
  12.                 for (i = 0; i < doc->DocumentElement->AttributeNodes->Count; i++)  
  13.                 {  
  14.                         sRes += " " + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeName  
  15.                                 + "=/"" + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeValue + "/"";  
  16.                 }  
  17.                 sRes += ">/r/n";  
  18.   
  19.         for (i = 0; i < doc->DocumentElement->ChildNodes->Count; ++i){  
  20.                 sRes += formatXMLNode(doc->DocumentElement->ChildNodes->Nodes[i], indent);  
  21.         }  
  22.         sRes += "</" + doc->DocumentElement->NodeName + ">/r/n";  
  23.         return  sRes;  
  24. }  
  25.   
  26. AnsiString formatXMLNode(_di_IXMLNode element, int indent)  
  27. {  
  28.   
  29.         AnsiString sBlank = "";  
  30.         AnsiString sRes = "";  
  31.         int i;  
  32.         for (i = 0; i < indent; ++i){  
  33.                 sBlank += " ";  
  34.         }  
  35.   
  36.         if (element->NodeType == ELEMENT_NODE  
  37.                 && element->ChildNodes && element->ChildNodes->Count > 0  
  38.                 && element->ChildNodes->Nodes[0]->NodeType != TEXT_NODE)  
  39.         {  
  40.                 sRes = sBlank + '<'+element->NodeName;  
  41.                 for (i = 0; i < element->AttributeNodes->Count; i++)  
  42.                 {  
  43.                         sRes += " " + element->AttributeNodes->Nodes[i]->NodeName  
  44.                                 + "=/"" + element->AttributeNodes->Nodes[i]->NodeValue + "/"";  
  45.                 }  
  46.                 sRes += ">/r/n";  
  47.                 indent++;  
  48.                 for (i = 0; i < element->ChildNodes->Count; i++)  
  49.                 {  
  50.                         sRes += formatXMLNode(element->ChildNodes->Nodes[i], indent);  
  51.                 }  
  52.                 sRes += sBlank + "</" + element->NodeName + ">/r/n";  
  53.         }  
  54.         else if (element->NodeType != PROCESSING_INSTRUCTION_NODE)  
  55.         {  
  56.                 sRes += sBlank + element->XML + "/r/n";  
  57.         }  
  58.         return sRes;  
  59. }  

3、注意事项
以上描述的方式是通过XML控件方式来操作XML文档。在使用对象方式操作XML文件时,需要注意一些问题。
在加载一个文件时,不需要创建一个TXMLDocument对象(TXMLDocument *myxml = new TXMLDocument()),
而是使用_di_IXMLDocument接口。从文件加载XML文件是使用LoadXMLDocument来获得该接口的实例。操作
一个空的XML文档并开始写时也是使用该接口NewXMLDocument获得该接口。

0 0
原创粉丝点击