如何查找XML子元素中是否存在具有特定值的属性?

如何查找XML子元素中是否存在具有特定值的属性?,xml,excel,vba,Xml,Excel,Vba,我试图找出XML文档根的每个子元素中是否存在具有特定值的XML属性。我的代码如下: Option Explicit Dim sheet As Worksheet Dim rowCount1, i As Integer Dim xNode As MSXML2.IXMLDOMNode Dim xDoc As MSXML2.DOMDocument Dim Nodes As MSXML2.IXMLDOMNodeList Public Sub LoadDocument() rowCount1 = 0 S

我试图找出XML文档根的每个子元素中是否存在具有特定值的XML属性。我的代码如下:

Option Explicit
Dim sheet As Worksheet
Dim rowCount1, i As Integer
Dim xNode As MSXML2.IXMLDOMNode
Dim xDoc As MSXML2.DOMDocument
Dim Nodes As MSXML2.IXMLDOMNodeList

Public Sub LoadDocument()
rowCount1 = 0
Set xDoc = New MSXML2.DOMDocument
xDoc.validateOnParse = False
 If xDoc.load("D:\Feedroutes.xml") Then ' The document loaded successfully.
  Set Nodes = xDoc.SelectNodes("//Property[@name='Value']")
  AttributesToColumns
  Else
 ' The document failed to load.
 End If
End Sub

Public Sub AttributesToColumns()
 Set sheet = ActiveSheet

 For Each xNode In Nodes
  If Not Nodes Is Nothing Then
   rowCount1 = rowCount1 + 1
   sheet.Cells(rowCount1, 3).Value = xNode.Text
  'I want to increment the rowCount even if the attribute with the
  'specific value doesn't exist
  ElseIf Nodes Is Nothing Then
  rowCount1 = rowCount1 + 1

  End If
 Next xNode
End Sub
目前,它只在连续的行中写入属性值,而所需的输出是,只在存在具有特定值的属性的行中写入。我的XML如下所示:

<Tag name="PosLim" path="Feeders/R1" type="OPC">
  <Property name="Value">0.0</Property>
  <Property name="DataType">4</Property>
  <Property name="OPCServer">Ignition OPC-UA Server</Property>
  <Property name="OPCItemPath">[Siemens]DB141,I74</Property>
  <Property name="ScaleMode">1</Property>
  <Property name="RawHigh">1000.0</Property>
  <Property name="FormatString">#,##0.00</Property>
  <Property name="EngUnit">Kg</Property>
</Tag>
<Tag name="JogSettle" path="Feeders/R1" type="OPC">
  <Property name="DataType">1</Property>
  <Property name="OPCServer">Ignition OPC-UA Server</Property>
  <Property name="OPCItemPath">[Siemens]DB141,I96</Property>
  <Property name="RawHigh">1000.0</Property>
  <Property name="FormatString">#,##0</Property>
  <Property name="EngUnit">S</Property>
</Tag>
<Tag name="Positive Tol" path="Feeders/R1" type="OPC">
  <Property name="Value">0.0</Property>
  <Property name="DataType">4</Property>
  <Property name="OPCServer">Ignition OPC-UA Server</Property>
  <Property name="OPCItemPath">[Siemens]DB141,I78</Property>
  <Property name="ScaleMode">1</Property>
  <Property name="RawHigh">1000.0</Property>
  <Property name="FormatString">#,##0.00</Property>
  <Property name="EngUnit">Kg</Property>
</Tag>

您的
节点
值仅具有name=值的属性节点,因此,您无法确定要跳过哪些节点。您需要做的是选择所有标记节点,然后检查该标记是否具有名称=值的属性

首先添加一个附加行以保存属性标记

Dim propertyNode作为MSXML2.IXMLDOMNode

然后,在
LoadDocument
Sub中,选择所有标记节点(而不是选择name=value的节点)

Set Nodes=xDoc.SelectNodes(“//标记”)

现在您已经有了所有标记,可以跳过任何没有name=Value属性的标记。将
AttributesToColumns
Sub中
For
语句中的代码替换为以下内容

Set propertyNode = xNode.SelectSingleNode("Property[@name='Value']")
If Not propertyNode Is Nothing Then sheet.Cells(rowCount1, 3).Value = propertyNode.Text
rowCount1 = rowCount1 + 1

嗨,杰卡尔,它工作了!非常感谢你清晰准确的回答。非常感谢。没有你的时间和努力是不可能的。我们必须学习更多关于XPath和XML的知识。
Set propertyNode = xNode.SelectSingleNode("Property[@name='Value']")
If Not propertyNode Is Nothing Then sheet.Cells(rowCount1, 3).Value = propertyNode.Text
rowCount1 = rowCount1 + 1