2

特定の値を持つ 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 = "Value" の属性 "name" の値と、他のすべての属性を、連続する行ではなく、対応する行に書き込むことです。したがって、上記のxmlファイルから、私のExcel出力は次のようになります。

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

1 に答える 1

3

あなたのNodes値には name=Value を持つ Property ノードしかありません。それから、どのノードがスキップされているかを判断できません。必要なことは、すべてのタグ ノードを選択し、そのタグに name=Value のプロパティがあるかどうかを確認することです。

まず、プロパティ タグを保持する行を追加します。

Dim propertyNode As MSXML2.IXMLDOMNode

次に、LoadDocumentSub で、すべてのタグ ノードを選択します (name=value でノードを選択する代わりに)。

Set Nodes = xDoc.SelectNodes("//Tag")

すべてのタグが揃ったので、name=Value のプロパティを持たないタグはスキップできます。SubのForステートメントのコードを次のように置き換えます。AttributesToColumns

Set propertyNode = xNode.SelectSingleNode("Property[@name='Value']")
If Not propertyNode Is Nothing Then sheet.Cells(rowCount1, 3).Value = propertyNode.Text
rowCount1 = rowCount1 + 1
于 2013-08-27T18:15:08.527 に答える