代码之家  ›  专栏  ›  技术社区  ›  Amey

如何读取XmlDiff.Compre()生成的diffgram文件

  •  3
  • Amey  · 技术社区  · 10 年前

    我正在使用XMLDiff.compare()比较两个XML文件,这是我第一次使用,无法确定如何处理生成的diffgram文件以生成两个XML中的差异的HTML。

    bool bIdentical = xmldiff.Compare(originalFile, newFile, false, diffgramWriter);
    

    原始文件所在位置

    <?xml version="1.0" encoding="utf-8"?>
    <testsOutputData>
    <TestName_AK1>
        <FeatureID ID="33B50792-207E514">
            <Intance_ID_1 >
                <CommandString>ABC </CommandString>
                <ProductID>100000</ProductID>
                <ProjectName>No Project</ProjectName>
                <TaskID>TESTSUITE</TaskID>
                <Type>Local</Type>
                <User></User>
            </Intance_ID_1>
            <Intance_ID_2>
                <CommandString>PQR </CommandString>
                <ProductID>1000</ProductID>
                <ProjectName>No Project</ProjectName>
                <TaskID>TESTSUITE</TaskID>
                <Type>Local</Type>
                <User></User>
            </Intance_ID_2>
            <Intance_ID_3>
                <CommandString>ABC </CommandString>
                <ProductID>1000</ProductID>
                <ProjectName>No Project</ProjectName>
                <TaskID>TESTSUITE</TaskID>
                <Type>Local</Type>
                <User></User>
            </Intance_ID_3>
        </FeatureID>
    </TestName_AK1>
    

    新文件是

    <?xml version="1.0" encoding="utf-8"?>
    <testsOutputData>
    <TestName_AK1>
        <FeatureID ID="33B50792-207E514">
            <Intance_ID_2>
                <CommandString>PQR </CommandString>
                <ProductID>1000</ProductID>
                <ProjectName>No Project</ProjectName>
                <TaskID>TESTSUITE</TaskID>
                <Type>Local</Type>
                <User></User>
            </Intance_ID_2>
            <Intance_ID_1 >
                <CommandString>ABC </CommandString>
                <ProductID>100000</ProductID>
                <ProjectName>No Project</ProjectName>
                <TaskID>TESTSUITE</TaskID>
                <Type>Local</Type>
                <User></User>
            </Intance_ID_1>
            <Intance_ID_3>
                <CommandString>ABC </CommandString>
                <ProductID>1000</ProductID>
                <ProjectName>No Project</ProjectName>
                <TaskID>TESTSUITE</TaskID>
                <Type>Local</Type>
                <User></User>
            </Intance_ID_3>
        </FeatureID>
    </TestName_AK1>
    

    生成的diffgramwriter为

    <xd:xmldiff version="1.0" srcDocHash="11314582626391529293" options="None" fragments="no" xmlns:xd="http://schemas.microsoft.com/xmltools/2002/xmldiff">
    <xd:node match="2">
    <xd:node match="1">
      <xd:node match="1">
        <xd:add match="/2/1/1/2" opid="1" />
        <xd:remove match="2" opid="1" />
      </xd:node>
    </xd:node>
    </xd:node>
    <xd:descriptor opid="1" type="move" />
    </xd:xmldiff>
    

    现在使用这个需要生成HTML文件。(这是后面的部分) 但我无法正确理解(读取)diffgram文件, 无法理解

    <xd:add match="/2/1/1/2" opid="1" />
        <xd:remove match="2" opid="1" />
    

    <xd:descriptor opid="1" type="move" />
    

    在其他情况下,它们在其他diffgram中更多是这种类型的节点。 我怎样才能理解这个diffgram文件,从而生成一个HTML

    1 回复  |  直到 10 年前
        1
  •  3
  •   Tom Ash    10 年前

    您可以在XmlDiffView类中使用diffgram。但对我来说,这并不完美。它突出了区别,但也显示我删除了一些节点并添加了新节点。

    XmlDiffView dv = new XmlDiffView();
    //Load the original file again and the diff file.
    XmlTextReader orig = new XmlTextReader("F:\\XML_1.xml");
            XmlTextReader diffGram = new XmlTextReader("F:\\diff.xml");
            dv.Load(orig,
                diffGram);
    
            //Wrap the HTML file with necessary html and 
            //body tags and prepare it before passing it to the GetHtml method.
    
            string tempFile =  "F:\\diff" +r.Next() + ".htm";
            StreamWriter sw1 = new StreamWriter(tempFile);
            sw1.Write("<html><body><table width='100%'>");
            //Write Legend.
            sw1.Write("<tr><td colspan='2' align='center'><b>Legend:</b> <font style='background-color: yellow'" +
                " color='black'>added</font>&nbsp;&nbsp;<font style='background-color: red'" +
                " color='black'>removed</font>&nbsp;&nbsp;<font style='background-color: " +
                "lightgreen' color='black'>changed</font>&nbsp;&nbsp;" +
                "<font style='background-color: red' color='blue'>moved from</font>" +
                "&nbsp;&nbsp;<font style='background-color: yellow' color='blue'>moved to" +
                "</font>&nbsp;&nbsp;<font style='background-color: white' color='#AAAAAA'>" +
                "ignored</font></td></tr>");
    
            dv.GetHtml(sw1);
            sw1.Write("</table></body></html>");
            sw1.Close();
            dv = null;
            orig.Close();
            diffGram.Close();
    

    我用你的xml文件运行了这个,它们是相等的。当我将CommandString值从ABC修改为ABCD时,我得到了高亮显示的更改值。