2

そこで、マイクロソフトが提供する 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);

これを回避する方法、またはより良い方法で回避する方法についての考えはありますか?

どんな助けでも大歓迎です。

4

0 に答える 0