从文档中选择多个XML节点,然后在TListbox Delphi中显示

从文档中选择多个XML节点,然后在TListbox Delphi中显示,xml,delphi,xpath,pascal,txmldocument,Xml,Delphi,Xpath,Pascal,Txmldocument,我在delphi中使用IXMLDocument创建了一个XML文件,我需要访问名为Manufacturer的每个节点上的文本值,并在单击按钮1时在TListBox中显示结果 以下是我创建XML文件的方式,该文件在FormCreate上被称为: procedure TfrmMain.CreateXML; var BikeXMLDoc: IXMLDocument; Root, Bike, Manufacturer, Model, Year, Ratio1, Ratio2, Ratio3, R

我在delphi中使用IXMLDocument创建了一个XML文件,我需要访问名为Manufacturer的每个节点上的文本值,并在单击按钮1时在TListBox中显示结果

以下是我创建XML文件的方式,该文件在FormCreate上被称为:

procedure TfrmMain.CreateXML;
var
  BikeXMLDoc: IXMLDocument;
  Root, Bike, Manufacturer, Model, Year, Ratio1, Ratio2, Ratio3, Ratio4, Ratio5,
  Ratio6, Ratio7, PriRatio: IXMLNode;
begin
  // Create XML Document for bikes.xml
  BikeXmlDoc := TXMLDocument.Create(nil);
  BikeXmlDoc.Active := True;
  BikeXmlDoc.Options := BikeXmlDoc.Options + [doNodeAutoIndent];
  BikeXmlDoc.Version := '1.0';

  // Create Document Root Element
  Root := BikeXmlDoc.CreateNode('Bikes');
  BikeXmlDoc.DocumentElement := Root;

  // Create First Bike Node
  Bike := BikeXmlDoc.CreateNode('Bike');

  // Add Required Elements with values for Honda Fireblade 2012
  Manufacturer := BikeXmlDoc.CreateNode('Manufacturer');
  Manufacturer.Text := 'Honda';
  Model := BikeXmlDoc.CreateNode('Model');
  Model.Text := 'Fireblade CBR1000';
  Year := BikeXmlDoc.CreateNode('Year');
  Year.Text := '2012';
  Ratio1 := BikeXmlDoc.CreateNode('Ratio1');
  Ratio1.Text := '2.286';
  Ratio2 := BikeXmlDoc.CreateNode('Ratio2');
  Ratio2.Text := '1.778';
  Ratio3 := BikeXmlDoc.CreateNode('Ratio3');
  Ratio3.Text := '1.500';
  Ratio4 := BikeXmlDoc.CreateNode('Ratio4');
  Ratio4.Text := '1.333';
  Ratio5 := BikeXmlDoc.CreateNode('Ratio5');
  Ratio5.Text := '1.214';
  Ratio6 := BikeXmlDoc.CreateNode('Ratio6');
  Ratio6.Text := '1.138';
  Ratio7 := BikeXmlDoc.CreateNode('Ratio7');
  PriRatio := BikeXmlDoc.CreateNode('PriRatio');
  PriRatio.Text := '1.717';

  // Add elements to XML File
  Root.ChildNodes.Add(Bike);
  Bike.ChildNodes.Add(Manufacturer);
  Bike.ChildNodes.Add(Model);
  Bike.ChildNodes.Add(Year);
  Bike.ChildNodes.Add(Ratio1);
  Bike.ChildNodes.Add(Ratio2);
  Bike.ChildNodes.Add(Ratio3);
  Bike.ChildNodes.Add(Ratio4);
  Bike.ChildNodes.Add(Ratio5);
  Bike.ChildNodes.Add(Ratio6);
  Bike.ChildNodes.Add(Ratio7);
  Bike.ChildNodes.Add(PriRatio);

  // Save the XML File
  //ShowMessage('XML File Created : ' + AppFileLocation + 'bikes.xml');
  BikeXmlDoc.SaveToFile(AppFileLocation+'bikes.xml');
  BikeXmlDoc.Active := False;
  BikeXmlDoc := nil;
end;
代码又重复了4次,向XML文件添加了4个元素,我没有在这里添加代码,因为我认为这不是必需的。完成的XML文件如下所示:

<?xml version="1.0"?>
<Bikes>
  <Bike>
    <Manufacturer>Honda</Manufacturer>
    <Model>Fireblade CBR1000</Model>
    <Year>2012</Year>
    <Ratio1>2.286</Ratio1>
    <Ratio2>1.778</Ratio2>
    <Ratio3>1.500</Ratio3>
    <Ratio4>1.333</Ratio4>
    <Ratio5>1.214</Ratio5>
    <Ratio6>1.138</Ratio6>
    <Ratio7/>
    <PriRatio>1.717</PriRatio>
  </Bike>
  <Bike>
    <Manufacturer>Kawasaki</Manufacturer>
    <Model>ZX6R 636</Model>
    <Year>2013</Year>
    <Ratio1>2.846</Ratio1>
    <Ratio2>2.200</Ratio2>
    <Ratio3>1.850</Ratio3>
    <Ratio4>1.600</Ratio4>
    <Ratio5>1.421</Ratio5>
    <Ratio6>1.300</Ratio6>
    <Ratio7/>
    <PriRatio>1.900</PriRatio>
  </Bike>
  <Bike>
    <Manufacturer>Suzuki</Manufacturer>
    <Model>GSXR1000</Model>
    <Year>2011</Year>
    <Ratio1>2.562</Ratio1>
    <Ratio2>2.052</Ratio2>
    <Ratio3>1.714</Ratio3>
    <Ratio4>1.500</Ratio4>
    <Ratio5>1.360</Ratio5>
    <Ratio6>1.269</Ratio6>
    <Ratio7/>
    <PriRatio>1.617</PriRatio>
  </Bike>
  <Bike>
    <Manufacturer>Triumph</Manufacturer>
    <Model>Daytona 675R</Model>
    <Year>2010</Year>
    <Ratio1>2.312</Ratio1>
    <Ratio2>1.857</Ratio2>
    <Ratio3>1.565</Ratio3>
    <Ratio4>1.350</Ratio4>
    <Ratio5>1.238</Ratio5>
    <Ratio6>1.136</Ratio6>
    <Ratio7/>
    <PriRatio>1.848</PriRatio>
  </Bike>
  <Bike>
    <Manufacturer>Yamaha</Manufacturer>
    <Model>YZF R1</Model>
    <Year>2013</Year>
    <Ratio1>2.533</Ratio1>
    <Ratio2>2.063</Ratio2>
    <Ratio3>1.762</Ratio3>
    <Ratio4>1.522</Ratio4>
    <Ratio5>1.364</Ratio5>
    <Ratio6>1.269</Ratio6>
    <Ratio7/>
    <PriRatio>1.512</PriRatio>
  </Bike>
</Bikes>
当按下按钮1时,XML文件再次被访问,每个制造商的文本值都列在ListBox1.Items中,我如何才能做到这一点

我尝试过使用XPath的解决方案,只选择一个节点,但我需要能够选择所有节点


谢谢大家。

从文件加载文档:

通过XPath加载节点列表

枚举所选节点并提取文本


另外:

从文件加载文档:

通过XPath加载节点列表

枚举所选节点并提取文本


另外:

可能是这样的,它未经测试,在这里使用在线德尔福参考编写,现在没有德尔福:

uses
  XMLDoc, XMLIntf, XMLDOM;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  XMLDocument: IXMLDocument;
  DOMNodeList: IDOMNodeList;
  DOMNodeSelect: IDOMNodeSelect;    
begin
  XMLDocument := LoadXMLDocument('c:\File.xml');
  if Assigned(XMLDocument) and 
    Supports(XMLDocument.DocumentElement.DOMNode, IDOMNodeSelect, DOMNodeSelect) then
  begin
    DOMNodeList := DOMNodeSelect.selectNodes('/Bikes/Bike/Manufacturer/text()');
    ListBox1.Items.BeginUpdate;
    try
      ListBox1.Items.Clear;
      for I := 0 to DOMNodeList.length - 1 do
        ListBox1.Items.Add(DOMNodeList.item[I].nodeValue);
    finally
      ListBox1.Items.EndUpdate;
    end;           
  end;
end;

可能是这样,它未经测试,在这里使用在线德尔福参考编写,现在没有德尔福:

uses
  XMLDoc, XMLIntf, XMLDOM;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  XMLDocument: IXMLDocument;
  DOMNodeList: IDOMNodeList;
  DOMNodeSelect: IDOMNodeSelect;    
begin
  XMLDocument := LoadXMLDocument('c:\File.xml');
  if Assigned(XMLDocument) and 
    Supports(XMLDocument.DocumentElement.DOMNode, IDOMNodeSelect, DOMNodeSelect) then
  begin
    DOMNodeList := DOMNodeSelect.selectNodes('/Bikes/Bike/Manufacturer/text()');
    ListBox1.Items.BeginUpdate;
    try
      ListBox1.Items.Clear;
      for I := 0 to DOMNodeList.length - 1 do
        ListBox1.Items.Add(DOMNodeList.item[I].nodeValue);
    finally
      ListBox1.Items.EndUpdate;
    end;           
  end;
end;

BikeXmlDoc:=TXMLDocument.Createnil;我听说那很危险。由于内部引用计数错误,您必须提供一些非零所有者。浏览澳大利亚Delphi用户组博客了解更多详细信息您使用XPath的解决方案是什么?显示代码。/Bikes/Bike/Manufacturer XPath返回所有文本。所以-显示代码,为什么不获得下一个节点只是关于TXMLDocument.Create的说明,在创建新的XML文档时使用。BikeXmlDoc:=TXMLDocument.Createnil;我听说那很危险。由于内部引用计数错误,您必须提供一些非零所有者。浏览澳大利亚Delphi用户组博客了解更多详细信息您使用XPath的解决方案是什么?显示代码。/Bikes/Bike/Manufacturer XPath返回所有文本。所以-显示代码,为什么不获取下一个节点只是关于TXMLDocument的说明。创建,在创建新XML文档时使用。+1,我刚刚修复了您的代码以便检索值,也不用担心检查selectNodes结果是否为空nil,因为如果找到不匹配的节点,集合将返回长度为0。+1,我刚刚修复了您的代码以便检索值,也不用担心检查selectNodes结果是否为空nil,因为如果找到不匹配的节点,集合将返回长度0。