有没有办法像DataTable一样管理对不规则XML文档的更改?我正在寻找一种导入和导出XML数据文档更改列表的方法(结构不规则;不适合数据集)。如果我有一个通用的结构,我会使用DataTable,我可以评估哪些记录已被编辑,然后提交或取消更改,我还可以传输所需更改的数据包。如何使用XML数据执行此操作?如果没有好的答案,我认为我最好的选择是使用DataTable和方案[XPath,Value],尽管存储效率低下且导航困难。我想对文档进行更改(使用XPath或LINQ或数据绑定控件或其他),然后记住更改并通过TCP发送它们。然后我想接收另一个更改列表并将其应用于XML文档。我不想发送整个文档的大小,因为我需要了解和评估发送的更改。(澄清一下:我的程序需要发送和接收文档更改。管道的另一端不是基于.net的,也不是这个问题的一部分。)您需要对这些更改采取行动还是只存储它们,如果您只想存储较新的版本,可以使用二进制差异算法来传输2个xml文件之间的差异。然后以不同的方式更新存储的版本。一个很好的算法是bifdiffC#版本,可以在此处找到。另一种方法是使用MS中的XmlDiff类Howdoyouwanttosendonlythechanges?您期望每次有很多变化还是只有微小的变化?您需要考虑哪些变化?您是否试图跨进程边界维护同一文档的副本?您如何解决冲突的更改?您想在更改传播之前锁定xml文档吗?两个副本是独立的,还是一个是主副本?如果您使用XmlDocument事件,如NodeInserted、NodeDeleted、NodeChanged等,您可以构建此类更改的列表,然后在另一个副本上执行它们。如果更改的总量超过文档本身,则可以发送文档。压缩xml数据也有帮助。除此之外,我看不到任何其他简单的方法。当您获得具有不规则结构的XML数据时;不自然地适合数据集,并且您希望对象模型能够轻松处理数据。您可以使用带有/classes选项的XML架构定义工具(Xsd.exe)从XML文件生成C#或VB.Net类。XSD.exe位于:C:ProgramFilesMicrosoftSDKsWindowsv6.0Abinxsd.exeC:ProgramFilesMicrosoftVisualStudio8SDKv2.0Binxsd.exe您从VisualStudio命令行运行xsd.exe。-开始-所有程序-VisualStudio-工具-命令行这是查看所有XSD命令行参数的命令:xsd/?将不规则的XML文件(XmlResponseObject.xml)转换为类:xsdc:TempXmlResponseObject.xml/classes/language:CS/out:c:Temp这将生成一个包含代表XML的类的csharp文件。您可能想将其重新输入到一个单独的类文件中,注意单个文件中由名称空间消除歧义的重复类。无论哪种方式,类都不是所有xml属性中最好看的,但好的部分是您可以通过XML绑定它们。这是我通过RESTWeb服务检索XML的示例,xmlResponseObject是适用于XML的类的ObjectModel。公共接口IYourWebService{XmlResponseObjectGetData(intdataId);}publicclassYourWebService:IYourWebService{publicXmlResponseObjectGetData(intdataId){XmlResponseObjectxmlResponseObject=null;varurl="http://SomeSite.com/Service/GetData/"+dataId;尝试{varrequest=WebRequest.Create(url)asHttpWebRequest;如果(请求!=null){request.AllowAutoRedirect=true;请求.KeepAlive=真;request.UserAgent="Mozilla/4.0(兼容;MSIE7.0;WindowsNT5.1;.NETCLR2.0.50727;.NETCLR3.0.4506.2152;.NETCLR3.5.30729;.NETCLR1.1.4322;InfoPath.2;.NET4.0C;.NET4.0E)";request.Credentials=CredentialCache.DefaultNetworkCredentials;request.CookieContainer=newCookieContainer();varresponse=request.GetResponse()asHttpWebResponse;if(request.HaveResponse&&response!=null){varstreamReader=newStreamReader(response.GetResponseStream());varxmlSerializer=newXmlSerializer(typeof(XmlResponseObj等));xmlResponseObject=(XmlResponseObject)xmlSerializer.Deserialize(streamReader);}}}catch(Exceptionex){stringdebugInfo="nURL:"+url;Console.Write(ex.Message+""+debugInfo+""+ex.StackTrace);}返回xmlResponseObject;鉴于您只想发送和接收文档更改,您可以使用IsDirty标志修改类我敢肯定,一旦您拥有了一个可以使用的类,它就会很容易检测到差异。要将任何XML数据加载到DataSet中,您必须提供相应的架构。请参阅从XML模式(XSD)派生数据集关系结构。此外,DataSet/DataTable不适用于XML文档。他们可以从中导入数据,并将数据导出到XML。我在任何地方都找不到任何可用的答案。似乎早在2003年MS就在谈论创建XPathDocument2或实现我所要求的(谈论即将发布的书籍提到它),但它似乎没有实现。所以这是我尝试的解决方案:使用XPathDocument/XPathNavigator,并为Change/Delete/Insert添加事件处理程序。对于每个事件,在DataTable{XPath|旧值|NewValue}代表变化。准备提交时,发送表格,然后清除它。如果取消,则使用表信息撤消XPathDocument中的更改。我还没有实现这个,但它似乎有用。我曾多次尝试寻找免费或开源的XML差异工具,但从未找到真正符合要求的东西。本质上,您正在寻找树差异,它本身就是一张完整的光盘。我想您使用XML的事实是次要的,因为它只是另一种形式的树。您“只是”定义指定节点的内容。虽然树编辑距离的因式分解算法计算两棵树之间的距离,但我怀疑您是否可以对其进行转换以提供所有变化,因为它是距离度量的基础。检测后如何传达更改完全取决于您。这可能是从XML到JSON。请注意,该算法的作者提到他们在几十行中创建了一个Python版本,因此如果您删除一行,它们可能会有所帮助。如果你能做到这一点,看起来你可能是第一个发布实际概念证明的人:)你在这里遇到的问题是XML只是一种表示数据的形式,不一定是数据本身。这是您正在使用的某种XML编辑器,还是XML只是一种传输?如果您将xml视为一种传输方式,当您谈论发送XML更改描述时,您可能希望在生成更改本身时生成这些更改描述,并且每个更改描述都不会在同一模式中作为原始数据。此外,数据集可以这样做的原因是因为数据集中的每一行都有一个已知的唯一键。因此,可以针对行而不是整个集合发回更改。XML不是那样工作的,每一行都没有唯一的键。XPath可用作更改定位器,但这比发送具有足够编辑的整个文档效率低。为什么不使用任何标准修补算法将XML简单地视为文本呢?(看Git或Hg的源码)以上是C#学习教程:有没有办法管理不规则XML文档的变化,比如用DataTable?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
