有人说,Delphi对msxml.dll做了封装,对xml控件做了简单化,更容易编程!我觉得delphi的控件,牺牲了很多msxml.dll的有用的方法和属性!大家是怎么看的!谁有简单的原代码可以offer的吗??我在程序里面使用导入库做的,结果load XML文件的时候就报错!访问冲突!怎么回事?万分感谢!!!!!!!!!!!!!

解决方案 »

  1.   

    unit main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;type
      TfrmXML = class(TForm)
        XMLDocument1: TXMLDocument;
        XMLDocument2: TXMLDocument;
        Memo1: TMemo;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmXML: TfrmXML;
      n1,n2,n3: IXMLNode;implementation{$R *.dfm}procedure TfrmXML.Button1Click(Sender: TObject);
    begin
       XMLDocument1.loadfromfile('c:\a.xml');
       XMLDocument1.Active:=true;
       Memo1.Lines.Clear;
       n1:=XMLDocument1.DocumentElement;
       if n1=Nil then exit;
       Memo1.Lines.Add(n1.NodeName);
       n2:=n1.ChildNodes.Last;
       if N2=Nil then exit;
       Memo1.Lines.Add(n2.NodeName);
       n3:=n2.ChildNodes.First;
       while N3<>Nil do
       begin
          Memo1.Lines.Add(N3.Attributes['OrderNo']
             +N3.Attributes['ItemNo']+'       '
             +N3.Attributes['PartNo']+'       '
             +N3.Attributes['Qty']+'       '
             +N3.Attributes['Discount']);
          N3:=n3.NextSibling;
       end;
       XMLDocument1.Active:=false;
    end;procedure TfrmXML.Button2Click(Sender: TObject);
    var
       i: Integer;
    begin
       XMLDocument2.Active:=True;
       XMLDOcument2.Encoding:='GB2312';
       n1:=XMLDocument2.AddChild('单订项数据');
       for i:=3 to Memo1.Lines.Count do
          N1.AddChild('X'+IntToStr(i));
       XMLDocument2.SaveToFile('d:\output.xml');
       XMLDocument2.Active:=false;
    end;end.
      

  2.   

    你这样看, 那是因为你没有享受到TXMLDocument和XML Data Banding的好处。
    要充分挖掘VCL的潜力,如果VCL的确处理不了,你可以考虑自己写XML解析。
    当然,要看开发者的意愿,如果非要自己写解析,也可以。
    这里有简单的例子,这里其实重要用了XML的接口,如果要实现更加复杂的操作,就要付出很大的代价,不过如果程序结构合理,这种方法也是不错的。
    由于我的实际工作中用了XML Data Banding,所以我觉得快速开发中Data Banding的确是不错的选择。
    下面的代码是简单的XML解析例子。unit UnitTest;interfaceuses
      Classes, SysUtils, Forms, Dialogs, UnitMethod, UnitBookBuilder, XMLIntf,
      ActiveX, XMLDoc;    function  CreateBookInfo: Boolean;
        procedure FillData;
        procedure InitData;//外部XML文件处理DLL需要用到的接口//////////////////////////////////////////////
        //初始化DOM环境
        procedure InitEnvironment();
        function  WriteInfo(pXMLNodeName: String;pXMLNodeText: String): Boolean;
        function  SaveXMLFile(xmlFileName: String): Boolean;
        procedure XML_Exit();
    ////////////////////////////////////////////////////////////////////////////////implementationvar
        xml: IXMLDocument;{$R BookInfo.res}procedure InitEnvironment();
    begin
        CoInitialize(nil);
        xml := TXMLDocument.Create(nil);
    end;procedure XML_Exit();
    begin
        CoUnInitialize();
    end;function SearchNode(pXMLNodeList: IXMLNodeList;pXMLNodeName: String;pXMLNodeText: String): IXMLNode;
    var
        pXMLNode : IXMLNode;
    ChildList: IXMLNodeList;
    I        : Integer;
    begin
    if(pXMLNodeList = nil)then//链表为空
        begin
            Result := nil;
         exit;
        end;
        I := 0;
    while I <= pXMLNodeList.Count - 1 do
        begin
    pXMLNode := pXMLNodeList.Get(I);        if pXMLNodeName = pXMLNode.NodeName then
            begin
                pXMLNode.NodeValue := pXMLNodeText;
                exit;
            end; if pXMLNode.HasChildNodes then
            begin
    ChildList := pXMLNode.ChildNodes;//递归处理XML文件
    SearchNode(ChildList,pXMLNodeName,pXMLNodeText);
            end;
            Inc(I);
        end;
    end;function WriteInfo(pXMLNodeName: String;pXMLNodeText: String): Boolean;
    begin
        SearchNode(xml.ChildNodes,pXMLNodeName,pXMLNodeText);
        Result := True;
    end;function SaveXMLFile(xmlFileName: String): Boolean;
    begin
        xml.SaveToFile(xmlFileName);
        Result := True;
    end;end.
      

  3.   

    兔:jaguarcts(jaguarcts) 、 Rainsea(飞龙在天)首先!谢谢你们的回复!
    二位的原代码我以逐行扫描过了!收益不少!
    我首先问问你们有用过XPath的吗?
    就我以前做过VB和XML项目的经验来说,我更觉得更喜欢直接使用SelectNode和SelectNodes来得到一个节点!而XML的VCL里面没有这个方法,请问你们是如何使用vcl里面的现有方法快速得到一个节点或者其下的子节点的呢?谢谢先!或者再给个详细点的列子!谢谢先!!!
      

  4.   

    请问在DELPHI中怎样导入MSXML的DLL文件??
      

  5.   

    DELPHI中操纵MSXML?
    XMLDocument了D6-7都有的http://www.csdn.net/develop/read_article.asp?id=12428