2016-08-15 39 views
0

我创建,根据MySQL的行生成XML WebService的,结果是这样的:FindNode与二等于节点

<DB> 
    <CONFIG> 
     <ID>1</ID> 
     <CODAUTORIZACAO>12345</CODAUTORIZACAO> 
     <CODUSUARIO>12345</CODUSUARIO> 
     <CODEMPRESA>12345</CODEMPRESA> 
     <NOMEEMPRESA>TESTE</NOMEEMPRESA> 
    </CONFIG> 
    <COLETEIROS> 
     <ID>1</ID> 
     <CODIGO>123</CODIGO> 
     <NOME>teste</NOME> 
     <PRECOCX>1</PRECOCX> 
     <PRECOKG>1</PRECOKG> 
     <PRECOCS>1</PRECOCS> 
    </COLETEIROS> 
    <COLETEIROS> 
     <ID>2</ID> 
     <CODIGO>135</CODIGO> 
     <NOME>ab</NOME> 
     <PRECOCX>12</PRECOCX> 
     <PRECOKG>321</PRECOKG> 
     <PRECOCS>12</PRECOCS> 
    </COLETEIROS> 
</DB> 

如果你看到,这个XML具有相同的名称“COLETEIROS”双节点,但是当我找到与XMLDocument.DocumentElement.ChildNodes.FindNode('COLETEIROS')我只能看到第一个节点。有没有办法FindNode存在?我想用这个值填充组合框,但我是新的XMLDocument。

感谢您的帮助!

+0

遍历节点 –

+0

我没有发现有关迭代到Delphi XMLDocument的任何内容,仅适用于C#和Delphi NativeXML,但在Delphi XE10 NativeXML被替换为XMLDocument,我不知道等价的代码,因为我不知道这两个哈哈:/ –

+0

所有的XML库允许枚举 –

回答

2

哪里有多个子节点FindNode将只返回任何指定节点的第一个。 FindNode返回IXMLNode

为了获得具有指定名称的所有节点的列表,可以使用的selectNodes()的IDOMNode接口的方法。 selectNodes()返回IDOMNodeList。您可以像往常一样遍历节点列表。

uses 
    XMLDoc, 
    XMLDOM, 
    XMLIntf; 

procedure ExampleUsingSelectNodes; 
const 
    XML = '<DB>' 
     + ' <CONFIG>' 
     + '  <ID>1</ID>' 
     + '  <CODAUTORIZACAO>12345</CODAUTORIZACAO>' 
     + '  <CODUSUARIO>12345</CODUSUARIO>' 
     + '  <CODEMPRESA>12345</CODEMPRESA>' 
     + '  <NOMEEMPRESA>TESTE</NOMEEMPRESA>' 
     + ' </CONFIG>' 
     + ' <COLETEIROS>' 
     + '  <ID>1</ID>' 
     + '  <CODIGO>123</CODIGO>' 
     + '  <NOME>teste</NOME>' 
     + '  <PRECOCX>1</PRECOCX>' 
     + '  <PRECOKG>1</PRECOKG>' 
     + '  <PRECOCS>1</PRECOCS>' 
     + ' </COLETEIROS>' 
     + ' <COLETEIROS>' 
     + '  <ID>2</ID>' 
     + '  <CODIGO>135</CODIGO>' 
     + '  <NOME>ab</NOME>' 
     + '  <PRECOCX>12</PRECOCX>' 
     + '  <PRECOKG>321</PRECOKG>' 
     + '  <PRECOCS>12</PRECOCS>' 
     + ' </COLETEIROS>' 
     + '</DB>'; 
var 
    doc: TXMLDocument; 
    select: IDOMNodeSelect; 
    nodes: IDOMNodeList; 
begin 
    doc := TXMLDocument.Create(nil); 
    doc.LoadFromXML(XML); 

    select := doc.DocumentElement.DOMNode as IDOMNodeSelect; 
    nodes := select.selectNodes('COLETEIROS'); 

    // At this point nodes is an IDOMNodeList with length 2 (i.e. contains both COLETEIROS nodes) 

    // process the list of nodes here 
end; 

另外,您可以遍历文档中的每个子节点,并测试每一个需要的节点名,只处理符合你想要的名称的人。这是更啰嗦,但完全与接口,而不需要DOM支持(这可能会或可能不重要在您的情况下)接口。

假设为这种情况下的示例XML文档相同的XML常量声明,用于手动迭代代码将是这样的:

var 
    doc: TXMLDocument; 
    node: IXMLDOMNode; 
begin 
    doc := TXMLDocument.Create(nil); 
    doc.LoadFromXML(XML); 

    node := doc.DocumentElement.ChildNodes.First; 
    while Assigned(node) do 
    begin 
    if node.NodeName = 'COLETEIROS' then 
    begin 
     // Do something with this node 
    end; 
    node := node.NextSibling 
    end; 
end; 
0

FindNode()不能用于搜索的多个节点。您将有两种:

  1. 遍历所有节点手动寻找个人COLETEIROS节点:

    var 
        Node: IXMLNode; 
        I: Integer; 
    
    for I := 0 to XMLDocument.DocumentElement.ChildNodes.Count-1 do 
    begin 
        Node := XMLDocument.DocumentElement.ChildNodes[I]; 
        if Node.LocalName = 'COLETEIROS' then 
        ... 
    end; 
    
  2. 使用XPath查询:

    var 
        XPath: IDOMNodeSelect; 
        Nodes: IDOMNodeList; 
        Node: IDOMNode; 
        I: Integer; 
    
    if Supports(XMLDocument.DocumentElement, IDOMNodeSelect, XPath) then 
    begin 
        Nodes := XPath.selectNodes('/DB/COLETEIROS'); 
        for I := 0 to Nodes.length-1 do 
        begin 
        Node := Nodes[I]; 
        ... 
        end; 
    end;