如何仅获取 c# 上下文中两个 xml 文件的更改?

     2023-02-16     272

关键词:

【中文标题】如何仅获取 c# 上下文中两个 xml 文件的更改?【英文标题】:How to get changes only, of two xml files in c# context? 【发布时间】:2020-01-13 01:55:09 【问题描述】:

我正在设置一个 XML 转换器,在此步骤之前,我必须比较两个 XML 文件,过滤掉新的更改或条目,并仅将更改保存在新文件中。

使用XmlDiffPatch,我能够比较这两个文件并将其保存为 DiffGram 格式。但是当我修补diffGramFileoriginalFile 时,输出就像我的originalFile 一样,所以我一无所获。有没有办法删除两个文件的重复项或只保存更改?

这是我生成 diffGram 并对其进行修补的代码。

static void Main(string[] args)
        
            string file1 = "C:\\temp\\test.xml";
            string file2 = "C:\\temp\\test2.xml";
            string output = "C:\\temp\\output.xml";
            string finaloutput = "C:\\temp\\final.xml";

            //DiffXmlStrict(file1, file2);

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(output, settings);

            GenerateDiffGram(file1, file2, writer);
            PatchUp(file2, output, finaloutput);
        

        public static void GenerateDiffGram(string finalFile, string originalFile, XmlWriter diffGramWriter)
        
            XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
                                             XmlDiffOptions.IgnoreNamespaces |
                                             XmlDiffOptions.IgnorePrefixes);
            bool bIdentical = xmldiff.Compare(originalFile, finalFile, false, diffGramWriter);
            diffGramWriter.Close();
        
        public static void PatchUp(String originalFile, String diffGramFile, String OutputFile)
        
            XmlDocument sourceDoc = new XmlDocument(new NameTable());
            sourceDoc.Load(originalFile);
            XmlTextReader diffgramReader = new XmlTextReader(diffGramFile);

            XmlPatch xmlPatch = new XmlPatch();
            xmlPatch.Patch(sourceDoc, diffgramReader);


            XmlTextWriter output = new XmlTextWriter(OutputFile, Encoding.Unicode);
            sourceDoc.Save(output);
            output.Close();

        

输入文件: 文件1:test.xml

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xliff version="1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-transitional.xsd">
    <file source-language="en" datatype="plaintext" date="2016-02-08T14:15:00Z">
        <header/>
        <body>
            <trans-unit  datatype="plaintext" id="ErrorCode.1001" resname="ErrorCode.1001" >
                <source>Call not implemented.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1002" resname="ErrorCode.1002" >
                <source>Cannot copyy %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1003" resname="ErrorCode.1003" >
                <source>Cannot create all parameters for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1004" resname="ErrorCode.1004" >
                <source>Cannot create %e for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1005" resname="ErrorCode.1005" >
                <source>Cannot delete all parameters for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1006" resname="ErrorCode.1006" >
                <source>Cannot find %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1007" resname="ErrorCode.1007" >
                <source>Cannot get %s name.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1008" resname="ErrorCode.1008" >
                <source>Cannot get object.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1009" resname="ErrorCode.1009" >
                <source>Cannot get parameter.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1010" resname="ErrorCode.1010" >
                <source>Cannot load document for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1011" resname="ErrorCode.1011" >
                <source>Cannot unload document for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1012" resname="ErrorCode.1012" >
                <source>Cannot reload document for %s.</source>
            </trans-unit>
        </body>
    </file>
</xliff>

文件 2:test2.xml

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xliff version="1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-transitional.xsd">
    <file source-language="en" datatype="plaintext" date="2016-02-08T14:15:00Z">
        <header/>
        <body>
            <trans-unit  datatype="plaintext" id="ErrorCode.1001" resname="ErrorCode.1001" >
                <source>Call not implemented.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1002" resname="ErrorCode.1002" >
                <source>Cannot copy %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1003" resname="ErrorCode.1003" >
                <source>Cannot create all parameters for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1004" resname="ErrorCode.1004" >
                <source>Cannot create %e for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1005" resname="ErrorCode.1005" >
                <source>Cannot delete all parameters for %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1006" resname="ErrorCode.1006" >
                <source>Cannot find %s.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1007" resname="ErrorCode.1007" >
                <source>Cannot get %s name.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1008" resname="ErrorCode.1008" >
                <source>Cannot get object.</source>
            </trans-unit>
            <trans-unit  datatype="plaintext" id="ErrorCode.1009" resname="ErrorCode.1009" >
                <source>Cannot get parameter.</source>
            </trans-unit>
        </body>
    </file>
</xliff>

并且finaloutput 文件等于文件 1..

希望得到一些帮助。

【问题讨论】:

如果我理解正确的话,你想要的只是一个增量。在这种情况下,您不应该修补原始文件(无论如何它是过度完成的文件,因此它已经包含增量),而是使用 diffGramFile 代替。它已经包含增量,对吧?如果需要,只需应用 xslt 变换将其变为所需的形状(xliff 1.2)。 【参考方案1】:

试试 xml linq:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication131

    class Program
    
        const string INPUT_XML1 = @"c:\temp\test.xml";
        const string INPUT_XML2 = @"c:\temp\test1.xml";
        const string OUTPUT_XML = @"c:\temp\test2.xml";
        static void Main(string[] args)
        
            XDocument doc1 = XDocument.Load(INPUT_XML1);
            XElement body1 = doc1.Descendants("body").FirstOrDefault();
            XDocument doc2 = XDocument.Load(INPUT_XML2);
            XElement body2 = doc2.Descendants("body").FirstOrDefault();

            var query1 = (from d1 in body1.Elements()
                         join d2 in body2.Elements() on d1.ToString() equals d2.ToString() into p
                         from d2 in p.DefaultIfEmpty()
                         select new  d1 = d1, d2 = p == null ? null : d2 )
                         .Where(x => x.d2 == null)
                         .Select(x => x.d1)
                         .ToList();


            var query2 = (from d2 in body2.Elements()
                          join d1 in body1.Elements() on d2.ToString() equals d1.ToString() into p
                          from d1 in p.DefaultIfEmpty()
                          select new  d2 = d2, d1 = p == null ? null : d1 )
                          .Where(x => x.d1 == null)
                          .Select(x => x.d2)
                          .ToList();

            XElement newBody = new XElement("body", query1);
            newBody.Add(query2);
            body1.ReplaceWith(newBody);
            doc1.Save(OUTPUT_XML);

        
    





【讨论】:

对我来说效果很好,但第二个查询 (query2) 仍然没有必要,因为它会返回未更改的值,因此输出中的更改条目有两个条目。 当我测试时,我从每个列表中删除了不同的项目。两个文件必须有细微差别才能放回相同的项目。该代码正在测试整个元素,因此有些不同(可能是间距或小写/大写差异)。

C#比较存储在XML文件中的两个日期时间

...描述】:我有一个包含这些日期时间的XML文件。是否可以获取最近时间与上次时间的时差?例如:在这张照片中,最近的时间是10/27/202109:15,上一次是10/26/202116:52,所以我想得到这两次的差异并在时间后面运行一些东西如果时差... 查看详情

C#如何从xml文件中获取所有元素名称

】C#如何从xml文件中获取所有元素名称【英文标题】:C#howcanIgetallelementsnamefromaxmlfile【发布时间】:2010-10-2506:44:56【问题描述】:我想从一个xml文件中获取所有元素名称,例如xml文件是,<BookStore><BookStoreInfo><Address/>&... 查看详情

在 c# 中比较两个 pdf 文件的最佳方法是啥?

...】:如果它们相同,您可以进行二进制比较。如果要进行上下文比较,您可能需 查看详情

C# |如何更改 XML 文档中的命名空间?

】C#|如何更改XML文档中的命名空间?【英文标题】:C#|HowdoIchangethenamespaceinanXMLdocument?【发布时间】:2021-11-2823:17:18【问题描述】:所以我正在努力更改XML中特定节点的命名空间。这就是我想要实现的目标:<SOAP-ENV:Envelopexmlns:SO... 查看详情

在 C# 中将 2 个 Xml 文件与 XDocument 相交

...】:2021-01-1012:31:22【问题描述】:我有2个XML文件,我想获取两个文件中的所有XNode,仅基于它们相同的属性“id”。这是一个XML文件的样子:<parameters><itemid="57"><länge>8</länge> 查看详情

如何从 RSA 公钥 XML 文件 .net core c# 中获取 n 值

】如何从RSA公钥XML文件.netcorec#中获取n值【英文标题】:HowtogetnvaluefromRSApublickeyXMLfile.netcorec#【发布时间】:2022-01-1617:05:42【问题描述】:JWKS端点的n值是多少。如何从.netcorec#中的RSA公钥XML文件中获取n值。这是我的RSA公钥。<RSA... 查看详情

如何使用 C# ASP.Net 从 XML 文档中获取特定 XML 元素的列表?

】如何使用C#ASP.Net从XML文档中获取特定XML元素的列表?【英文标题】:HowtogetlistofspecificXMLelementsfromXMLdocumentusingC#ASP.Net?【发布时间】:2020-07-1008:32:39【问题描述】:我正在尝试从XML文档中获取一组特定的元素,以使用XSLT文件显... 查看详情

不覆盖 C# 窗口窗体中保存的 xml 文件

...是C#的新手,我想知道如果安装中已经存在一个XML文件,如何防止其被覆盖。在应用程序中,有两个文件包含连接到数据库的信息。其中一个是相对动态的,但另一个保存在设置中。如果我进行发布并尝试更新应用程序,它总是... 查看详情

我将我的 C# 程序添加到 Windows 注册表中如何获取我在代码中右键单击的文件?

...使用C#编写了一个简单的hellowordProgramm并将其添加到Windows上下文菜单中。 查看详情

如何在 c# 中读取由代码度量生成的这个 xml 文件

】如何在c#中读取由代码度量生成的这个xml文件【英文标题】:Howtoreadthisxmlfilegeneratedbycodemetrics,inc#【发布时间】:2021-07-1506:02:51【问题描述】:读取此xml文件以获取方法名称及其圈值这是xml文件,我需要读取圈复杂度值,并将... 查看详情

在 C# 中合并两个 XML 文件

】在C#中合并两个XML文件【英文标题】:MergetwoXMLFilesinC#【发布时间】:2021-04-2905:38:20【问题描述】:您好,我正在尝试合并两个XML文件。但是,我从来没有在正确的地方建立连接。我尝试了两件事,但没有成功。这两个XML文件... 查看详情

如何检测两个列表的顺序是不是更改,如果更改则在c#中显示新添加或删除的成员

】如何检测两个列表的顺序是不是更改,如果更改则在c#中显示新添加或删除的成员【英文标题】:howtodetectiftheorderoftwolistschangedandifchangedthenshownewlyaddedordeletedmembersinc#如何检测两个列表的顺序是否更改,如果更改则在c#中显示新... 查看详情

使用c#的相对路径

...\file.xml");但它没有获取文件。它显示了一些“C:”路径..如何从项目本 查看详情

如何使用开放的 XML C# 从 .xlsx 获取单元格中显示的值

】如何使用开放的XMLC#从.xlsx获取单元格中显示的值【英文标题】:Howtogetvalueshownincellfrom.xlsxusingopenXMLC#【发布时间】:2013-05-2005:11:23【问题描述】:我是C#新手并打开XML,所以请耐心等待我的无知。我有这个问题:我需要从.xlsx... 查看详情

如何使用 c# 从 azure blob 存储中检索 xml 文件

】如何使用c#从azureblob存储中检索xml文件【英文标题】:howtoretrieveanxmlfilefromazureblobstorageusingc#【发布时间】:2021-12-2317:09:38【问题描述】:我想从Blob存储中检索2个Xml文件并使用c#返回这些文件。不用担心连接、容器名和文件名... 查看详情

使用上下文 API (React.js) 仅更改状态对象中的特定键

】使用上下文API(React.js)仅更改状态对象中的特定键【英文标题】:UsingcontextAPI(React.js)tochangeonlyaparticularkeyinstateobject【发布时间】:2021-06-0810:45:31【问题描述】:我在响应中使用上下文API来管理状态。为此,我创建了一个文件AppC... 查看详情

C#:如何在文本框中获取 xml 值?

】C#:如何在文本框中获取xml值?【英文标题】:C#:howtogetxmlvalueintextbox?【发布时间】:2020-04-0407:40:37【问题描述】:我有一个XML文件<current><city><country>JAPAN</country></city><temperaturevalue="307.07"min="307.07"max="307 查看详情

如何在 C# 中正确连接两个 Json 文件?

】如何在C#中正确连接两个Json文件?【英文标题】:HowtoRightJointwoJsonfilesinC#?【发布时间】:2021-08-1819:28:24【问题描述】:我想用一个公共键连接两个json文件,并从右侧文件中获取所有记录并从左侧获取匹配数据。如果是SQL。SELE... 查看详情