我用TXMLDocument组件来读取一个XML文件,并用IXMLDOMNode定义了一个根节点ndRoot,然后:
  XML1.LoadFromFile( 'Setting.xml' );
  XML1.Active := True;
  ndRoot := (XML1.DocumentElement.DOMNode as IXMLDOMNodeRef).GetXMLDOMNode;  for i:=1 to 8 do
  begin
    g_aryStrTag[i][1] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/StartStop/@TagName' ).nodeValue;
    g_aryStrTag[i][2] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Flow/@TagName' ).nodeValue;
    g_aryStrTag[i][3] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Type1/@TagName' ).nodeValue;
    g_aryStrTag[i][4] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Type2/@TagName' ).nodeValue;
    g_aryStrTag[i][5] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Group/@TagName' ).nodeValue;
    g_aryStrTag[i][6] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Total/@TagName' ).nodeValue;
    g_aryStrTag[i][7] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Archive/@TagName' ).nodeValue;
    g_aryStrTag[i][8] := ndRoot.selectSingleNode( '/TagLog/Tank[' + IntToStr(i) +']/Spare1/@TagName' ).nodeValue;
  end;XML文件中有8个Tank节点,上面的程序在一些电脑上可以正常运行,但在有些电脑上报错,我跟踪了一下,发现在出错电脑上的Tank节点的索引是以0开始,而不是1,即Tank[1]不是第一个Tank节点,而是第二个,这样当i循环到8时,节点Tank[8]是不存在的,因此报错。
我想问一下,MSXML对XML文件的读取有不同的方式吗?怎样才能将不同电脑的XML设置成一样的读取方式?

解决方案 »

  1.   


    uses
      msxml, ComObj;const    
      XML_DOC = '<?xml version="1.0" encoding="UTF-8"?>' +
                '<root><item>budded</item><item>vista</item></root>';  
                                                           
      // msxml parser 4.0
      ProgID_FreeThreadedDOMDocument30 = 'Msxml2.FreeThreadedDOMDocument.3.0';
      // msxml parser 4.0
      ProgID_FreeThreadedDOMDocument40 = 'Msxml2.FreeThreadedDOMDocument.4.0';
      // msxml parser 6.0
      ProgID_FreeThreadedDOMDocument60 = 'Msxml2.FreeThreadedDOMDocument.6.0';{$R *.dfm}procedure TForm8.msxml31Click(Sender: TObject);
    begin
      Caption := ParseXML(ProgID_FreeThreadedDOMDocument30, XML_DOC, 'root/item[1]')
    end;procedure TForm8.msxml3Click(Sender: TObject);
    begin
      Caption := ParseXML(ProgID_FreeThreadedDOMDocument30, XML_DOC, 'root/item[0]')
    end;procedure TForm8.msxml41Click(Sender: TObject);
    begin
      Caption := ParseXML(ProgID_FreeThreadedDOMDocument40, XML_DOC, 'root/item[1]')
    end;procedure TForm8.msxml4Click(Sender: TObject);
    begin
      Caption := ParseXML(ProgID_FreeThreadedDOMDocument40, XML_DOC, 'root/item[0]')
    end;procedure TForm8.msxml61Click(Sender: TObject);
    begin
      Caption := ParseXML(ProgID_FreeThreadedDOMDocument60, XML_DOC, 'root/item[1]')
    end;procedure TForm8.msxml6Click(Sender: TObject);
    begin
      Caption := ParseXML(ProgID_FreeThreadedDOMDocument60, XML_DOC, 'root/item[0]')
    end;function TForm8.ParseXML(const ProgID, XMLDoc, Path: String): String;
    var
      FIntf: IXMLDOMDocument;
      FNode: IXMLDOMNode;
    begin
      Result := '';
      FIntf := CreateOleObject(ProgID) as IXMLDOMDocument;
      if Assigned(FIntf) and FIntf.loadXML(XMLDoc) then
      begin
        FNode := FIntf.selectSingleNode(Path);
        if Assigned(FNode) then
          Result := FNode.text;
      end;
    end;
    结果我就不说了,自己看看去吧
      

  2.   

    File/New/那里可以新建
    XMLDataBind自动生成xml的接口
      

  3.   

    TXMLDocument都会有这个问题,TXMLDocument会调用msxmldom单元里的CreateDOMDocument方法创建IXMLDOMDocument接口,创建的版本顺序是:msxml4.0->msxml3.0,而4.0和3.0版本的接口是有区别的,