そこで、マイクロソフトが提供する XMLDiff を使用して、2 つの XML ファイルの違いを見つけようとしています。目的は、2 つの XML ファイルを比較し、正確な違いを見つけて、それらから監査証跡を作成できるようにすることです。ファイルの構造が異なる場合があります (ノードの追加または削除)。
ただし、ネストされた繰り返し構造に関しては、XMLDiff は予期しない出力を返すようです。
XML の例 #1 (オリジナル):
<pd:AP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pd="http://www.ascentn.com/bpm/XMLSchema">
<pd:processFields />
<pd:formFields>
<pd:TextBox1>val 1</pd:TextBox1>
<pd:DropdownList1>Option 4</pd:DropdownList1>
<pd:TextBox2>val 2</pd:TextBox2>
<pd:CheckBox1>Option 2;Option 3;Option 4</pd:CheckBox1>
<pd:SubForm1_SubForm>
<pd:SubForm1>
<pd:TextBox3>val 3</pd:TextBox3>
<pd:DropdownList3>Option 3</pd:DropdownList3>
<pd:DropdownList2>Option 2</pd:DropdownList2>
</pd:SubForm1>
<pd:SubForm1>
<pd:TextBox3>val 4</pd:TextBox3>
<pd:DropdownList3>Option 5</pd:DropdownList3>
<pd:DropdownList2>Option 3</pd:DropdownList2>
</pd:SubForm1>
</pd:SubForm1_SubForm>
</pd:formFields>
</pd:AP>
XML の例 #2 (変更):
<pd:AP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pd="http://www.ascentn.com/bpm/XMLSchema">
<pd:processFields />
<pd:formFields>
<pd:TextBox1>val 1.changed</pd:TextBox1>
<pd:DropdownList1>Option 4</pd:DropdownList1>
<pd:TextBox2>val 2</pd:TextBox2>
<pd:CheckBox1>Option 2;Option 3;Option 4</pd:CheckBox1>
<pd:SubForm1_SubForm>
<pd:SubForm1>
<pd:TextBox3>val 3.changed</pd:TextBox3>
<pd:DropdownList3>Option 3</pd:DropdownList3>
<pd:DropdownList2>Option 2</pd:DropdownList2>
</pd:SubForm1>
<pd:SubForm1>
<pd:TextBox3>val 4</pd:TextBox3>
<pd:DropdownList3>Option 5</pd:DropdownList3>
<pd:DropdownList2>Option 11</pd:DropdownList2>
</pd:SubForm1>
<pd:SubForm1>
<pd:TextBox3>val 6</pd:TextBox3>
<pd:DropdownList3>Option 3</pd:DropdownList3>
<pd:DropdownList2>Option 3</pd:DropdownList2>
</pd:SubForm1>
</pd:SubForm1_SubForm>
</pd:formFields>
</pd:AP>
私が得るXMLファイルは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<xd:xmldiff version="1.0" srcDocHash="12260906919056999448" options="IgnoreChildOrder IgnoreNamespaces IgnorePrefixes " fragments="no" xmlns:xd="http://schemas.microsoft.com/xmltools/2002/xmldiff">
<xd:node match="1">
<xd:node match="2">
<xd:node match="5">
<xd:add type="1" name="SubForm1" ns="http://www.ascentn.com/bpm/XMLSchema" prefix="pd">
<xd:add>
<pd:DropdownList2 xmlns:pd="http://www.ascentn.com/bpm/XMLSchema">Option 11</pd:DropdownList2>
</xd:add>
<xd:add match="/1/2/5/2/1-2" opid="1" />
</xd:add>
<xd:node match="1">
<xd:node match="1">
<xd:change match="1">val 3.changed</xd:change>
</xd:node>
</xd:node>
<xd:node match="2">
<xd:add>
<pd:TextBox3 xmlns:pd="http://www.ascentn.com/bpm/XMLSchema">val 6</pd:TextBox3>
<pd:DropdownList3 xmlns:pd="http://www.ascentn.com/bpm/XMLSchema">Option 3</pd:DropdownList3>
</xd:add>
<xd:remove match="1-2" opid="1" />
</xd:node>
</xd:node>
<xd:node match="1">
<xd:change match="1">val 1.changed</xd:change>
</xd:node>
</xd:node>
</xd:node>
<xd:descriptor opid="1" type="move" />
</xd:xmldiff>
pd:SubForm1 の 2 番目のノードが表示されている場合、その中の 3 番目の要素のみを変更しているため、これは非常に奇妙です。ノードが削除され、再度追加されたときにそれが取り上げられるのはなぜですか? 変更としてフラグを立てる必要はありませんでしたか?
pd:SubForm1 の最初の 2 つのノードを変更すると、変更されたものとして取得されますが、3 番目 (最後のノードが変更される) とすぐに、削除と追加としてフラグが立てられます (最初の 2 つが変更されていない場合でも)。
そして、IgnoreChildOrder フラグを設定しました
XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
XmlDiffOptions.IgnoreNamespaces |
XmlDiffOptions.IgnorePrefixes);
これを回避する方法、またはより良い方法で回避する方法についての考えはありますか?
どんな助けでも大歓迎です。