XPath の下のすべてのノードを削除する必要があるループの実装に問題があります。これらのノードが削除されると、別のループで 2 番目のドキュメントからノードを挿入する必要があります。したがって、基本的には、既存のファイル内の古いデータを新しいデータに置き換えたいと考えています。
基本的なフレームワークはカバーできたと思いますが、まだ XPath 自体に問題がある可能性があります。また、動作中の子を削除する方法を取得できませんでした:(
私は基本的に VBA を使用した XML 解析に関する予備知識がないため、誰かが私を正しい方向に押し進めることができれば幸いです。
よろしく、daZza
これまでの私のコードは次のとおりです。
VBA:
Sub injectXML()
Dim sourceXML As DOMDocument60
Dim targetXML As DOMDocument60
Dim sourceNList As IXMLDOMNodeList
Dim sourceNode As IXMLDOMNode
Dim targetNList As IXMLDOMNodeList
Dim targetNode As IXMLDOMNode
Dim sourceAttributes As IXMLDOMNamedNodeMap
Dim targetAttributes As IXMLDOMNamedNodeMap
Set sourceXML = New DOMDocument60
sourceXML.Load ("C:\...\source.xml")
Set targetXML = New DOMDocument60
targetXML.Load ("C:\...\target.xml")
sourceXML.async = False
sourceXML.validateOnParse = False
targetXML.async = False
targetXML.validateOnParse = False
Set sourceNList = sourceXML.SelectNodes("//test/TLRule")
Set targetNList = targetXML.SelectNodes("//RuleCollection/TLRule/TLRule")
For Each targetNode In targetNList
[remove the node]
Next targetNode
For Each sourceNode In sourceNList
[append all Data from source.xml to target.xml]
Next sourceNode
sourceXML.Save ("C:\...\target.XML")
End Sub
ソース XML 構造:
<test>
<TLRule>
<RuleCommand>
<RuleID Value="0004" />
</RuleCommand>
</TLRule>
<TLRule>
<RuleCommand>
<RuleID Value="0005" />
</RuleCommand>
</TLRule>
</test>
ターゲット XML 構造:
<RuleCollection>
<TLRule>
[lots of other data in <TLRule> + child tags]
<TLRule>
<RuleCommand>
<RuleID Value="0004" />
<TLRule>
<TLRule>
<RuleCollection>
編集:
Martin のおかげで、マクロの最初の部分 (古いデータをすべて削除) を完了することができました。
Set targetNList = targetXML.SelectNodes("//RuleCollection/TLRule/TLRule/RuleCommand")
Set targetNListSubstitution = targetXML.SelectNodes("//RuleCollection/TLRule/TLRule/RuleSubstitution")
Set targetNListCleanUp = targetXML.SelectNodes("//RuleCollection/TLRule/TLRule")
For Each Item In targetNList
Item.ParentNode.RemoveChild (Item)
Next
For Each Item In targetNListSubstitution
Item.ParentNode.RemoveChild (Item)
Next
For Each Item In targetNListCleanUp
If Item.HasChildNodes = False Then Item.ParentNode.RemoveChild (Item)
Next
ここで、sourceXML / sourceNList からすべてのデータを注入する必要があります。ただし、上記の方法を使用して古いデータを削除した場所に注入する必要があるため、これはタスクの最も難しい部分のようです。
私の観点からは、そのために何らかのアンカー/ポインターが必要ですが、そこにどのように取得するかわかりません。
多分あなたの何人かが助けることができますか?大歓迎です。
よろしく、daZza