使用VBA选择单节点XML对象

使用VBA选择单节点XML对象,xml,vba,excel,Xml,Vba,Excel,嗨,我正在尝试访问下面的XML响应对象 <?xml version='1.0' encoding='UTF-8'?> <gfi_message version="1.0"> <header> <transactionId>123</transactionId> <timestamp>2018-02-08T15:59:41+08:00</timestamp> <

嗨,我正在尝试访问下面的XML响应对象

<?xml version='1.0' encoding='UTF-8'?>
  <gfi_message version="1.0">
    <header>
      <transactionId>123</transactionId>
      <timestamp>2018-02-08T15:59:41+08:00</timestamp>
      <processingTime>0.15</processingTime>
    </header>
    <body>
      <response name="action1" function="PRICING" version="1.0">
        <option name="data" ref="price169" />
      </response>
      <data format="NAME_VALUE" name="price169">
        <node name="European Call">
          <field name="Scenario" value="Trading" />
          <field name="Currency" value="USD" status="input" />
          <field name="CtrCcy" value="HKD" status="input" />
          <field name="Strategy" value="Call" status="input" />
          <field name="Model" value="Analytic" />
          <field name="Class" value="European" status="input" />
          <field name="Direction" value="Buy" status="input" />
          <field name="Spot" value="7.81241/7.82871" />
          <field name="Cutoff" value="TOK" />
          <field name="Market" value="OTC" />
          <field name="HorDate" value="15:59 Thu 8 Feb 18" status="input" />
          <field name="ValDate" value="12 Feb 18" />
          <field name="SpotDate" value="12 Feb 18" />
          <field name="Maturity" value="Odd Date" />
          <field name="ExDate" value="8 Feb 18" status="input" />
          <field name="ExDays" value="0" />
          <field name="ExTime" value="14:00 SGT" />
          <field name="DelDate" value="12 Feb 18" />
          <field name="DelDays" value="0" />
          <field name="PremDate" value="Mon 12 Feb 18" />
          <field name="PremType" value="Spot" />
          <field name="Strike" value="7.81241" />
          <field name="CtrStk" value="0.128001474576987" />
          <field name="FwdWealth" value="0\-0.002082079933987" status="input" />
      </node>
    </data>
  </body>
</gfi_message>
这里是“现场”:

在StackOverflow中提供代码时,最好使用LateBinding,或者至少共享正在使用的库。该代码执行以下操作:

  • 从PC加载XMLObject
    xmlObj.Load(“C:\myaddress\test.xml”)
  • 将地址
    gfi_message/body/data/node
    上的节点分配给变量
    nodesthattoment
  • 开始循环使用此变量-在示例中只有一个节点
  • 在该节点的
    ChildNodes
    中,它在
    .XML
    属性中查找
    “name=“Spot”
    字符串
  • 它会打印它找到的东西

只需使用
/gfi_message/body/data/node/field[@name='Spot']]
xpath,就可以找到特定的节点

注意-避免在XPath中使用/,因为它很慢

示例代码

Set objXML = CreateObject("MSXML2.DOMDocument.6.0")
With objXML
    .SetProperty "SelectionLanguage", "XPath"
    .ResolveExternals = True
    .ValidateOnParse = True
    .Async = False
    .Load "C:\Users\pankaj.jaju\Desktop\test2.xml"
End With

Set objNode= objXML.SelectSingleNode("/gfi_message/body/data/node/field[@name='Spot']")
Msgbox objNode.XML
输出


另一种方法如下。它将为您提供特定节点及其值

Sub DemoXML()
    Dim post As Object

    With CreateObject("MSXML2.DOMDocument")
        .async = False: .validateOnParse = False
        .Load (ThisWorkbook.Path & "\some_file.xml")

        Set post = .SelectNodes("//node//field[@name='Spot']")(0)
        MsgBox post.XML
        MsgBox post.getAttribute("value")
    End With
End Sub
输出:

<field name="Spot" value="7.81241/7.82871"/>
7.81241/7.82871

7.81241/7.82871
Sub DemoXML()
    Dim post As Object

    With CreateObject("MSXML2.DOMDocument")
        .async = False: .validateOnParse = False
        .Load (ThisWorkbook.Path & "\some_file.xml")

        Set post = .SelectNodes("//node//field[@name='Spot']")(0)
        MsgBox post.XML
        MsgBox post.getAttribute("value")
    End With
End Sub
<field name="Spot" value="7.81241/7.82871"/>
7.81241/7.82871