如何在Inno Setup中基于其子标记的值选择XML标记 [英] How to select XML tag based on value of its child tag in Inno Setup

查看:67
本文介绍了如何在Inno Setup中基于其子标记的值选择XML标记的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在XML元素的子元素中搜索文本"LIBRA ESTERLINA",并检索其他子元素的值.但是我的查询没有任何结果.

I'm trying to search for a text "LIBRA ESTERLINA" in a child element of XML element and retrieve values of others child elements. But my query yields nothing.

我的代码基于来自响应 /how-to-read-multiple-xml-nodes-inno-setup>如何读取多个XML节点? (Inno设置)和

My code is based on response from How to read multiple XML nodes? (Inno Setup) and response from 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;

这里是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>

推荐答案

请记住,我已建议您将此问题与您的需求更匹配:
用于根据子项的子值选择元素的XPath .

Remember, that I've suggested you this question as a closer match to your needs:
XPath to select element based on childs child value.

因此,您的XPath应该是:

So, your XPath should be:

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

这意味着您要选择item标签,该标签包含带有LIBRA ESTERLINA文本的moneda子标签.

Meaning, that you want to select the item tag, that contains moneda child tag with LIBRA ESTERLINA text.

还因为您只希望进行一次匹配(不是吗?),所以应该使用SelectSingleNode,您的代码将更加简单:

Also as you expect a single match only (don't you?), you should use SelectSingleNode and your code will be much simpler:

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); 

这篇关于如何在Inno Setup中基于其子标记的值选择XML标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆