2017-06-02 60 views
1

我試圖在XML元素的子元素中搜索文本「LIBRA ESTERLINA」,並檢索其他子元素的值。但是我的查詢什麼都沒有。如何根據Inno Setup中子標記的值選擇XML標記

我的代碼是基於responseHow to read multiple XML nodes? (Inno Setup)responseXPath: How to select elements based on their value?

function LoadValuesFromXMLMoneda(FileName: string): Boolean; 
var 
    XMLNode: Variant; 
    XMLNodeList: Variant; 
    XMLDocument: Variant; 
    Index: Integer; 
    id, moneda, dollar, abr, singPlur, caracter : String; 
begin 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.load(FileName); 
    if (XMLDocument.parseError.errorCode <> 0) then 
    begin 
     Log('The XML file could not be parsed. ' + XMLDocument.parseError.reason); 
     Result := False; 
    end 
     else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNodeList := 
     XMLDocument.SelectNodes('//listaMonedas/item/moneda[text()="LIBRA ESTERLINA"]'); 
    for Index := 0 to XMLNodeList.length - 1 do 
     begin 
     XMLNode := XMLNodeList.item[Index]; 

     id  := XMLNode.SelectSingleNode('id').Text; 
     moneda := XMLNode.SelectSingleNode('moneda').Text; 
     dollar := XMLNode.SelectSingleNode('dollar').Text; 
     abr  := XMLNode.SelectSingleNode('abr').Text; 
     singPlur := XMLNode.SelectSingleNode('singPlur').Text; 
     caracter := XMLNode.SelectSingleNode('caracter').Text; 
     MsgBox(id+moneda+dollar+abr+singPlur+caracter,mbInformation,MB_OK); 
     end; 
     Result := True; 
    end; 
    except 
    Log('An error occured!' + #13#10 + GetExceptionMessage); 
    Result := False; 
    end; 
end; 

這裏是XML

<ns1:obtenerMonedasResponse 
    xmlns:ns1="urn:v1.001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="http://www.example.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <listaMonedas xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:WSMoneda[21]"> 
    <item xsi:type="tns:WSMoneda"> 
     <id xsi:type="xsd:integer">1</id> 
     <moneda xsi:type="xsd:string">LIBRA ESTERLINA</moneda> 
     <dollar xsi:type="xsd:string">0.7767</dollar> 
     <abr xsi:type="xsd:string">GBP</abr> 
     <singPlur xsi:type="xsd:string">LIBRA:LIBRAS</singPlur> 
     <caracter xsi:type="xsd:string">£</caracter> 
     <flag16 xsi:type="xsd:string">Base64Img</flag16> 
     <flag24 xsi:type="xsd:string">Base64Img</flag24> 
     <flag32 xsi:type="xsd:string">Base64Img</flag32> 
    </item> 
    <item xsi:type="tns:WSMoneda"> 
     <id xsi:type="xsd:integer">1</id> 
     <moneda xsi:type="xsd:string">PESO MEXICANO</moneda> 
     <dollar xsi:type="xsd:string">18.7000</dollar> 
     <abr xsi:type="xsd:string">MXN</abr> 
     <singPlur xsi:type="xsd:string">PESO:PESOS</singPlur> 
     <caracter xsi:type="xsd:string">$</caracter> 
     <flag16 xsi:type="xsd:string">Base64Img</flag16> 
     <flag24 xsi:type="xsd:string">Base64Img</flag24> 
     <flag32 xsi:type="xsd:string">Base64Img</flag32> 
    </item> 
    </listaMonedas> 
</ns1:obtenerMonedasResponse> 
+0

這不是有效的XML文件 - 有許多標籤不匹配和未封閉的標籤。 –

+0

我從服務器(它是XML的一部分,它非常大)獲得這樣的結果,並且當我做XMLNodeList時:XMLDocument.SelectNodes('// listaMonedas/item「]'); –

+0

@MartinPrikryl我想告訴你大的 –

回答

1

記住,我建議你這個問題作爲一個更接近匹配您的需求:
XPath to select element based on childs child value

所以,你的XPath應該是:

XMLNodeList := 
    XMLDocument.SelectNodes('//listaMonedas/item[moneda/text()="LIBRA ESTERLINA"]'); 

意義,要選擇item標籤,包含moneda子標籤與LIBRA ESTERLINA文本。


而且像您期望只有一個匹配(不是嗎?),你應該使用SelectSingleNode和你的代碼會簡單得多:

XMLNode := 
    XMLDocument.SelectSingleNode('//listaMonedas/item[moneda/text()="LIBRA ESTERLINA"]'); 

id  := XMLNode.SelectSingleNode('id').Text; 
moneda := XMLNode.SelectSingleNode('moneda').Text; 
dollar := XMLNode.SelectSingleNode('dollar').Text; 
abr  := XMLNode.SelectSingleNode('abr').Text; 
singPlur := XMLNode.SelectSingleNode('singPlur').Text; 
caracter := XMLNode.SelectSingleNode('caracter').Text; 

MsgBox(id+moneda+dollar+abr+singPlur+caracter, mbInformation, MB_OK); 
+0

非常感謝 –