2017-06-02 3 views
1

XML要素の子要素でテキスト「LIBRA ESTERLINA」を検索し、他の子要素の値を取得しようとしています。しかし、私の質問は何も得られません。Inno Setupの子タグの値に基づいてXMLタグを選択する方法

が私のコードはここXPath: 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; 

からHow to read multiple XML nodes? (Inno Setup)からresponseresponseに基づいてい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

:また、あなたはシングルマッチが唯一、あなたがSelectSingleNodeを使うべき(?そうしない)とあなたのコードは非常に簡単になります期待して


タグの不一致と非閉じタグ。 –

+0

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"]'); 

意味、あなたはLIBRA ESTERLINAテキストでmoneda子タグが含まれているitemタグを、選択したいということ。数多くあります -

有効なXMLファイルではありません
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

ありがとう –

関連する問題