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

时间:2013-07-11 13:34:04

标签: xml delphi

我是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.什么是最好和最简单的解决方案?

提前感谢您的举例和解释。

4 个答案:

答案 0 :(得分:3)

正如其他人所建议您可以使用XPath来查找特定值,在这种情况下,使用此表达式/Data/Row/Designation[text()="1342153"]将在指定中找到包含值1342153的节点。

试试此示例代码

{$APPTYPE CONSOLE}

{$R *.res}

uses
  MSXML,
  SysUtils,
  ActiveX,
  ComObj;

Const
 XmlStr =
'<?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>';

procedure Test;
Var
  XMLDOMDocument  : IXMLDOMDocument;
  XMLDOMNode      : IXMLDOMNode;
begin
  XMLDOMDocument:=CoDOMDocument.Create;
  XMLDOMDocument.loadXML(XmlStr);
  XMLDOMNode := XMLDOMDocument.selectSingleNode('/Data/Row/Designation[text()="1342153"]');
  if XMLDOMNode<>nil then
   Writeln('Found');
end;

begin
 try
    CoInitialize(nil);
    try
      Test;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.

答案 1 :(得分:3)

我会假设,一旦找到Designation,您就会想要阅读其他条目(InnerOuter,{{1与名称一致的。}和Spin)。

Cage是解决此问题的完美解决方案。我的示例使用新表单,只删除XPathTMemo,并为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; 元素并循环显示它们包含的信息,您可以使用此功能(在上面的测试应用中添加第二个按钮,并将其用于{{1处理程序):

<Row>

答案 2 :(得分:1)

在Delphi中查询xml时,IXMLDocument和XPath是你的朋友 你可以找到很多来源,例如 XPath and TXmlDocument

答案 3 :(得分:0)

如果您想从xml查询数据,我建议您使用此处记录的XML转换http://docwiki.embarcadero.com/RADStudio/XE4/en/Converting_XML_Documents_into_Data_Packets

这会将xml映射到ClientDataSet,您可以按所需的列过滤记录,或者您可以使用DataBinding Wizard,它在此URL的文档中有解释http://docwiki.embarcadero.com/RADStudio/XE4/en/Using_the_XML_Data_Binding_Wizard

对于使用xml的其他方法,您可以在此处查看doc的主索引 http://docwiki.embarcadero.com/RADStudio/XE4/en/Working_with_XML_documents_Index