Borland C++ Builder 6.0 XML处理总结

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文件示例:
view plaincopy to clipboardprint?
       //加载XML文件   
       OpenDialog1->Filter = "XML(程序配置文件)|*.xml";   
if (!OpenDialog1->Execute()){   
               return;   
       }   
  
       XMLDoc->LoadFromFile(OpenDialog1->FileName);   
       _di_IXMLNode node = XMLDoc->DocumentElement;   
       if (node == NULL){   
               ShowMessage("不是合法的程序配置文件XML文件格式。");   
               return;   
       }  
        //加载XML文件
        OpenDialog1->Filter = "XML(程序配置文件)|*.xml";
 if (!OpenDialog1->Execute()){
                return;
        }

        XMLDoc->LoadFromFile(OpenDialog1->FileName);
        _di_IXMLNode node = XMLDoc->DocumentElement;
        if (node == NULL){
                ShowMessage("不是合法的程序配置文件XML文件格式。");
                return;
        }
 
2.1.2 使用控件方式保存XML文件示例:

view plaincopy to clipboardprint?
SaveDialog1->FileName = FDevTypeName + ".xml";   
        SaveDialog1->Filter = "XML(程序配置文件)|*.xml";   
        if (SaveDialog1->Execute()){   
                XMLDoc->Active=true;   
                XMLDoc->Version = "1.0";   
                XMLDoc->Encoding = "GB2312";   
                XMLDoc->Options << doNodeAutoIndent;   
                //建立文档主元素   
                XMLDoc->DocumentElement = XMLDoc->CreateElement("Config", "");   
                XMLDoc->DocumentElement->SetAttribute("DevType", FDevTypeName);   
                //从UI更新XML数据   
                UpdateXMLDataFromUI(XMLDoc->DocumentElement);   
                //格式化XML   
                XMLDoc->LoadFromXML(formatXMLDoc(XMLDoc, 1));   
                //保存XML文件   
                XMLDoc->SaveToFile(SaveDialog1->FileName);   
                ShowMessage("保存配置"+ SaveDialog1->FileName + "文件成功");   
        }  
SaveDialog1->FileName = FDevTypeName + ".xml";
        SaveDialog1->Filter = "XML(程序配置文件)|*.xml";
        if (SaveDialog1->Execute()){
                XMLDoc->Active=true;
                XMLDoc->Version = "1.0";
                XMLDoc->Encoding = "GB2312";
                XMLDoc->Options << doNodeAutoIndent;
                //建立文档主元素
                XMLDoc->DocumentElement = XMLDoc->CreateElement("Config", "");
                XMLDoc->DocumentElement->SetAttribute("DevType", FDevTypeName);
                //从UI更新XML数据
                UpdateXMLDataFromUI(XMLDoc->DocumentElement);
                //格式化XML
                XMLDoc->LoadFromXML(formatXMLDoc(XMLDoc, 1));
                //保存XML文件
                XMLDoc->SaveToFile(SaveDialog1->FileName);
                ShowMessage("保存配置"+ SaveDialog1->FileName + "文件成功");
        }
      
2.2 读
2.2.1 读取节点数据

view plaincopy to clipboardprint?
AnsiString GetNodeData(_di_IXMLNode panode,   
        AnsiString nodename, AnsiString defaultvalue)   
{   
        //取得子节点列表   
        _di_IXMLNodeList nodes = panode->ChildNodes;   
        //从子节点列表查找节点   
        _di_IXMLNode node = nodes->FindNode(nodename);   
        if (node == NULL){   
                return defaultvalue;   
        }   
        //从节点取得数据   
        return node->GetText();   
}  
        AnsiString GetNodeData(_di_IXMLNode panode,
                AnsiString nodename, AnsiString defaultvalue)
        {
                //取得子节点列表
                _di_IXMLNodeList nodes = panode->ChildNodes;
                //从子节点列表查找节点
                _di_IXMLNode node = nodes->FindNode(nodename);
                if (node == NULL){
                        return defaultvalue;
                }
                //从节点取得数据
                return node->GetText();
        } 
2.2.1 读取节点属性
view plaincopy to clipboardprint?
//在格式描述XML文件中定位列描述   
       nodename = "grid";   
       _di_IXMLNode uinode = XMLUI->DocumentElement;   
       _di_IXMLNodeList uinodelst = uinode->ChildNodes;   
       uinode = uinodelst->FindNode(nodename);   
       uinodelst = uinode->ChildNodes;   
          
       for (jdx = 0; jdx < uinodelst->Count; jdx++){   
               //取得当前列在表格中的位置   
               colname = uinodelst->Nodes[jdx]->GetText();   
               //设置列头   
               colheader = colname + "(" + uinodelst->Nodes[jdx]->GetAttribute("length") ;   
          
               //根据类型设置表格列类型,用于编辑   
               //取得节点属性示例   
               if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Hex")){   
                       colheader += ", Hex";   
               }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("DevType")){   
               }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Baud")){   
               }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Integer")){   
                       colheader += ", Dec";   
               }else{   
                       colheader += ", Dec";   
               }   
               colheader += ")";   
                  
               //...(省略)   
       }//~for(jdx...  
 //在格式描述XML文件中定位列描述
        nodename = "grid";
        _di_IXMLNode uinode = XMLUI->DocumentElement;
        _di_IXMLNodeList uinodelst = uinode->ChildNodes;
        uinode = uinodelst->FindNode(nodename);
        uinodelst = uinode->ChildNodes;
        
        for (jdx = 0; jdx < uinodelst->Count; jdx++){
                //取得当前列在表格中的位置
                colname = uinodelst->Nodes[jdx]->GetText();
                //设置列头
                colheader = colname + "(" + uinodelst->Nodes[jdx]->GetAttribute("length") ;
        
                //根据类型设置表格列类型,用于编辑
                //取得节点属性示例
                if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Hex")){
                        colheader += ", Hex";
                }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("DevType")){
                }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Baud")){
                }else if (AnsiString(uinodelst->Nodes[jdx]->GetAttribute("type")) == AnsiString("Integer")){
                        colheader += ", Dec";
                }else{
                        colheader += ", Dec";
                }
                colheader += ")";
                
                //...(省略)
        }//~for(jdx...
 
2.3 写
以下代码演示了如果添加子节点,以及设置属性,写XML文件在第1节点有所描述。
view plaincopy to clipboardprint?
void UpdateNodeData(_di_IXMLNode panode,   
               AnsiString nodename, AnsiString value, AnsiString friendlyname)   
       {   
               _di_IXMLNodeList nodes = panode->ChildNodes;   
               _di_IXMLNode node = nodes->FindNode(nodename);   
               if (node == NULL){   
                       //添加子节点   
                       node = panode->AddChild(nodename);   
                       //设置属性   
                       node->SetAttribute("FriendlyName", friendlyname);   
               }   
               //改变节点数据   
               node->SetText(value);   
       }  
 void UpdateNodeData(_di_IXMLNode panode,
                AnsiString nodename, AnsiString value, AnsiString friendlyname)
        {
                _di_IXMLNodeList nodes = panode->ChildNodes;
                _di_IXMLNode node = nodes->FindNode(nodename);
                if (node == NULL){
                        //添加子节点
                        node = panode->AddChild(nodename);
                        //设置属性
                        node->SetAttribute("FriendlyName", friendlyname);
                }
                //改变节点数据
                node->SetText(value);
        } 
2.4 格式化XML
以上代码为格式化XML,调用方式在写XML在2.1.2节中有描述。使用该组件的缩进方式直接
通过写入节点方式并不能得到格式化文档,当加载一个文件时可以自动格式化。一种简单的
格式化方式就是先保存好文件再读取一次,再保存就可以得到格式化的文档。

view plaincopy to clipboardprint?
//声明:该代码源于网络,并做了些修改   
//---------------------------------------------------------------------------   
//格式化XML文档   
//---------------------------------------------------------------------------   
AnsiString formatXMLDoc(TXMLDocument* doc, int indent)   
{   
  
        AnsiString sRes;   
        int i;   
        sRes = "<?xml version=\"" + doc->Version + "\" encoding=\"" + doc->Encoding + "\"?>\r\n";   
        sRes += "<" + doc->DocumentElement->NodeName;   
                for (i = 0; i < doc->DocumentElement->AttributeNodes->Count; i++)   
                {   
                        sRes += " " + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeName   
                                + "=\"" + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeValue + "\"";   
                }   
                sRes += ">\r\n";   
  
        for (i = 0; i < doc->DocumentElement->ChildNodes->Count; ++i){   
                sRes += formatXMLNode(doc->DocumentElement->ChildNodes->Nodes[i], indent);   
        }   
        sRes += "</" + doc->DocumentElement->NodeName + ">\r\n";   
        return  sRes;   
}   
  
AnsiString formatXMLNode(_di_IXMLNode element, int indent)   
{   
  
        AnsiString sBlank = "";   
        AnsiString sRes = "";   
        int i;   
        for (i = 0; i < indent; ++i){   
                sBlank += " ";   
        }   
  
        if (element->NodeType == ELEMENT_NODE   
                && element->ChildNodes && element->ChildNodes->Count > 0   
                && element->ChildNodes->Nodes[0]->NodeType != TEXT_NODE)   
        {   
                sRes = sBlank + '<'+element->NodeName;   
                for (i = 0; i < element->AttributeNodes->Count; i++)   
                {   
                        sRes += " " + element->AttributeNodes->Nodes[i]->NodeName   
                                + "=\"" + element->AttributeNodes->Nodes[i]->NodeValue + "\"";   
                }   
                sRes += ">\r\n";   
                indent++;   
                for (i = 0; i < element->ChildNodes->Count; i++)   
                {   
                        sRes += formatXMLNode(element->ChildNodes->Nodes[i], indent);   
                }   
                sRes += sBlank + "</" + element->NodeName + ">\r\n";   
        }   
        else if (element->NodeType != PROCESSING_INSTRUCTION_NODE)   
        {   
                sRes += sBlank + element->XML + "\r\n";   
        }   
        return sRes;   
}  
//声明:该代码源于网络,并做了些修改
//---------------------------------------------------------------------------
//格式化XML文档
//---------------------------------------------------------------------------
AnsiString formatXMLDoc(TXMLDocument* doc, int indent)
{

        AnsiString sRes;
        int i;
        sRes = "<?xml version=\"" + doc->Version + "\" encoding=\"" + doc->Encoding + "\"?>\r\n";
        sRes += "<" + doc->DocumentElement->NodeName;
                for (i = 0; i < doc->DocumentElement->AttributeNodes->Count; i++)
                {
                        sRes += " " + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeName
                                + "=\"" + doc->DocumentElement->AttributeNodes->Nodes[i]->NodeValue + "\"";
                }
                sRes += ">\r\n";

        for (i = 0; i < doc->DocumentElement->ChildNodes->Count; ++i){
                sRes += formatXMLNode(doc->DocumentElement->ChildNodes->Nodes[i], indent);
        }
        sRes += "</" + doc->DocumentElement->NodeName + ">\r\n";
        return  sRes;
}

AnsiString formatXMLNode(_di_IXMLNode element, int indent)
{

        AnsiString sBlank = "";
        AnsiString sRes = "";
        int i;
        for (i = 0; i < indent; ++i){
                sBlank += " ";
        }

        if (element->NodeType == ELEMENT_NODE
                && element->ChildNodes && element->ChildNodes->Count > 0
                && element->ChildNodes->Nodes[0]->NodeType != TEXT_NODE)
        {
                sRes = sBlank + '<'+element->NodeName;
                for (i = 0; i < element->AttributeNodes->Count; i++)
                {
                        sRes += " " + element->AttributeNodes->Nodes[i]->NodeName
                                + "=\"" + element->AttributeNodes->Nodes[i]->NodeValue + "\"";
                }
                sRes += ">\r\n";
                indent++;
                for (i = 0; i < element->ChildNodes->Count; i++)
                {
                        sRes += formatXMLNode(element->ChildNodes->Nodes[i], indent);
                }
                sRes += sBlank + "</" + element->NodeName + ">\r\n";
        }
        else if (element->NodeType != PROCESSING_INSTRUCTION_NODE)
        {
                sRes += sBlank + element->XML + "\r\n";
        }
        return sRes;
}

 

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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yin138/archive/2010/06/24/5691358.aspx

Borland C++ Builder 6 (汉化补丁终结版) 汉化说明 ======================================================= 欢迎使用剑客软件,您的支持是我们前进的不懈动力。 ------------------------------------------------------------------------- 软件名称: Borland C++ Builder 6.0 (汉化补丁终结版) 软件版本: 6.0 (Build 10.166 , Update 4) 授权形式: 免费 作品类型: 汉化补丁 应用平台: Win9x/Me/NT/2000/XP/2003 软件作者: 辛玉强 作者主页: Http://swordxy.126.com 作者邮件: xy_0717@163.com ------------------------------------------------------------------------- 软件简介: Borland C++ Builder 是目前唯一完美集成 COBRA 与 COM/COM+ 的 C++ 集成开发环境,可以快速开发具有 Web 服务支持功能的电子商务应用程序,全球率先实现跨平台、高效可视化开发 Windows/Linux 应用程序,兼容 CLX、VCL 和 Borland C++ for Linux,增强了对于 Microsoft Visual C++ 源程序的兼容程度,提供 MFC 6.0 版与 ATL 3.0 版函数库,比起 Visual C++ 的 MFC 来,VCL 要先进得多。 ------------------------------------------------------------------------- 新增功能: 在 Borland C++Builder 6 汉化补丁增强版 的基础上,进一步修正了 Borland 的图片及资源编辑器、SQL 监视器的一些小的翻译问题,力争翻译的更贴切。同时, 增加了对 Borland SQL 浏览器 、桌面数据库 、BDE 管理员 的汉化支持。 让您的 C++ Builder 更符合国人的习惯。 另外又新增加了安装时自选组件的功能, 您可以根据自己的需要来决定哪些组件需要汉化,定制属于您自己的开发环境。 最后,加入了一些其他的文件关联方式,如: C 、HPP 、DCR 、RES 、PAS 等等,便于您直接拿记事本来修改 C++ 的源文件而不用开启 C++Builder ,对于小范围的修改代码比较方便。 ------------------------------------------------------------------------- 汉化方法: 汉化前请确认 C++ Builder 6.0 及其相关程序程序没有运行,否则强行汉化可能会损坏文件。 下载后解压缩 RAR,运行 BCBswordH6.exe 将文件安装到原英文 BCB.exe 所在的目录 (一般为: C:\Program Files\Borland\CBuilder6\Bin) 即可使用。 如果您希望以后还能继续使用英文版, 请注意选择备份旧的文件,并注意在卸载本汉化补丁时选择 "反转" 以恢复英文版 (如果您不创建文件备份,卸载本汉化补丁时将不能恢复英文版,并且您需要重新安装 Borland C++ Builder 6.0 以恢复英文版)。 ------------------------------------------------------------------------- 郑重声明:  1.此软件原始版本版权归 Borland 公司所有,本人仅在原始软件基础上进行简体中文本地化。  2.感谢您使用 swordxy 的汉化作品。本人所有汉化作品均为免费发放,任何组织或个人未经本人允许,不得将本人的汉化作品用于商业活动或任何其它赢利性活动中。  3.本人的汉化只为使用方便而做,使用 swordxy 的汉化作品是您的自由选择,本人并不对由此给您的计算机系统带来的任何问题负责。  4.欢迎转载、传播 swordxy 的所有汉化作品。但请注意在转载或传播过程中保持汉化文件的完整性。请勿删除此说明文件并请尽量少改动汉化文件名。如果直接链接本站下载链接,请在下载位置注明出处。  5.在使用过程中如果发现翻译错误之处请及时来信指出。 6.如果确系因使用本软件导致软件运行不正常或系统不稳定(请先确认该问题是否原版软件已经存在), swordxy 并不能提供任何补偿或补救措施,swordxy 只能在纯学术研究的前提下,在获知具体出错现象后,尽可能的给与私人的友情帮助。 7.请勿向 swordxy 询问任何软件注册破解问题,对此类问题本人概不答复,软件使用中如有任何疑问,请发邮件到 xy_0717@163.com,但本人不保证一定能够解答。 -------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值