gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:52:48 28 4
gpt4 key购买 nike

我试图找出 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”的值(其中 name =“Value”)以及所有其他属性写入相应的行中,而不是连续的行中。因此,从上面的 xml 文件来看,我的 Excel 输出应该是:

   Row No.   Value        ScaleMode 
Row1 0 1
Row2
Row3 0 1 etc

最佳答案

您的 Nodes 值仅包含 name=Value 的 Property 节点,因此您无法确定要跳过哪些节点。您需要做的是选择所有 Tag 节点,然后检查该 Tag 是否具有 name=Value 的属性。

首先添加一行来保存您的属性标签

将 propertyNode 调暗为 MSXML2.IXMLDOMNode

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

设置节点 = xDoc.SelectNodes("//Tag")

现在您已经拥有了所有标签,您可以跳过任何不具有 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

关于xml - 如何查找XML子元素中是否存在具有特定值的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465494/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com