2016-08-15 41 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;