加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Delphi中使用XML文件查询?

发布时间:2020-12-15 09:20:46 所属栏目:大数据 来源:网络整理
导读:我是Delphi的新手,这就是我想做的事情.我有这样的 XML文件格式, ?xml version="1.0" encoding="UTF-8" standalone="yes"?Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Row Designation1234102/Designation Inner5.412/Inner Outer3.588/Oute
我是Delphi的新手,这就是我想做的事情.我有这样的 XML文件格式,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Row>
        <Designation>1234102</Designation>
        <Inner>5.412</Inner>
        <Outer>3.588</Outer>
        <Spin>4.732</Spin>
        <Cage>0.399</Cage>
    </Row>
    <Row>
        <Designation>1342153</Designation>
        <Inner>5.916</Inner>
        <Outer>4.084</Outer>
        <Spin>5.277</Spin>
        <Cage>0.408</Cage>
    </Row>
    ........
</Data>

我想用Delphi查询它.例如:我想要哪里的数据是1342153.什么是最好和最简单的解决方案?

提前感谢您的示例和解释.

解决方法

我将假设一旦你找到了指定,你就会想要阅读与指定一致的其他条目(内部,外部,旋转和笼子).

XPath是解决此问题的完美解决方案.我的示例使用了一个只有TMemo和TButton的新表单,并为Button1.OnClick事件添加了一个处理程序:

uses
  MSXML,ComObj,ActiveX;

const
  XMLText =  '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
             '<Data>' +
              '<Row>' +
                  '<Designation>1234102</Designation>' +
                  '<Inner>5.412</Inner>' +
                  '<Outer>3.588</Outer>' +
                  '<Spin>4.732</Spin>' +
                  '<Cage>0.399</Cage>' +
              '</Row>' +
              '<Row>' +
                 '<Designation>1342153</Designation>' +
                 '<Inner>5.916</Inner>' +
                  '<Outer>4.084</Outer>' +
                  '<Spin>5.277</Spin>' +
                  '<Cage>0.408</Cage>' +
              '</Row>' +
          '</Data>';

procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDoc: IXMLDOMDocument;
  Node,SibNode: IXMLDOMNode;
begin
  Memo1.Clear;
  XMLDoc := CoDOMDocument.Create;
  XMLDoc.loadXML(XMLText);

  // Select the node with the Designation you want.
  Node := XMLDoc.selectSingleNode('//Designation[text()="1342153"]');
  if Assigned(Node) then
  begin
    Memo1.Lines.Add('Found it.');
    Memo1.Lines.Add(Node.nodeName + ' = ' + Node.firstChild.nodeValue);

    // Read all the nodes at the same level as the Designation
    SibNode := Node.nextSibling;
    while SibNode <> nil do
    begin
      Memo1.Lines.Add(SibNode.nodeName + ' = ' + 
                      SibNode.firstChild.nodeValue);
      Sib := Sib.nextSibling;
    end;
  end;
end;

如果你想抓住所有< Row>元素,并循环它们包含的信息,你可以使用它(向上面的测试应用添加第二个按钮,并将其用于Button2.OnClick处理程序):

procedure TForm1.Button2Click(Sender: TObject);
var
  XMLDoc: IXMLDOMDocument;
  NodeList: IXMLDOMNodeList;
  Node,SibNode: IXMLDOMNode;
  i: Integer;
begin
  Memo1.Clear;
  XMLDoc := CoDOMDocument.Create;
  XMLDoc.loadXML(XMLText);
  NodeList := XMLDoc.selectNodes('/Data/Row');
  if Assigned(NodeList) then
  begin
    for i := 0 to NodeList.length - 1 do
    begin
      Node := NodeList.item[i];
      SibNode := Node.firstChild;
      while Assigned(SibNode) do
      begin
        Memo1.Lines.Add(SibNode.nodeName + ' = ' + 
                        SibNode.firstChild.nodeValue);
        SibNode := SibNode.nextSibling;
      end;
    end;
    // Add a blank line between groupings for readability
    Memo1.Lines.Add('');
  end;
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读