当前位置: 首页 > 编程语言 > C#

XDocument保存删除节点前缀分享

时间:2023-04-10 19:04:25 C#

XDocument保存删除节点前缀我有一个XML文档(自己开发的),其结构如下:UIPTaskIdgc8f3715c-4a82-42d2-916c-51515083e7e5UIPTaskNameg359FC555-9CC7-47D4-8ED3-EF973E7D74D7负责的个人搜索?g57201da8-62b4-46f2-9329-c71d86f39ffc是的我有一个实用程序可以清理XML文档并使用XDocument加载文件,然后循环遍历某些节点并替换值。完成后,我调用Save方法将文件保存在新位置,进一步检查后,Save方法删除了每个节点上的wf前缀。我怎么能保留这个?难道我做错了什么?这是我的代码示例:stringwf="wf";stringwkfl="C:\MyFiles\Temp\myfile1.rrr";XDocumentxdoc=XDocument.Load(wkfl);XElementvariables=xdoc.Descendents(wf+"variables").Single();foreach(XElementvariablesinvariables.Elements(wf+"variable")){XElementname=variable.Element(wf+"name");name.Value=name.Value+"_MODIFIED";}xdoc.Save(wkfl.Replace("\Temp\","\Modified\"));Save方法生成以下XML:UIPTaskIdgc8f3715c-4a82-42d2-916c-51515083e7e5UIPTaskNameg359FC555-9CC7-47D4-8ED3-EF973E7D74D7ResponsibleIndividualSearch?g57201da8-62b4-46f2-9329-c71d86f39ffc是可以通过简单地加载XML并在不进行任何编辑的情况下再次写入来重现此行为。这样做:varxdoc=XDocument.Parse(xml);Debug.WriteLine(xdoc.ToXml());产生输出:...使用辅助方法:返回writer.ToString();为什么会这样?您有两个具有相同值的命名空间,默认命名空间和以wf为前缀的命名空间:xmlns="http://example.com/workflow"xmlns:wf="http://example.com/workflow"因此,prefixwf:与wf元素和所有子元素完全没有前缀完全相同。因此,当将自身写回XML时,XElement可以有效地使用前缀wf:或根本不使用前缀而不更改输出XML的语义。那么XElement如何在多个有效前缀之间进行选择呢?事实证明,从XElement的引用源开始,名称空间/前缀属性对按照写入时添加的顺序被推送到下推堆栈,然后从堆栈的顶部到底部检查与元素名称空间的匹配-以相反的顺序有效地进行匹配,其中添加了属性。所以你的XElements被赋予了两个可能的有效前缀中的第二个-即没有前缀。总而言之,带前缀的XML在语义上与不带前缀的XML是一样的。没有合适的XML解析器应该关心这种差异。但是,如果出于某种原因您使用的代码采用wf:前缀而不是检查实际的命名空间名称(尽管不应该),您可以通过重新排序默认命名空间来强制使用该前缀写出XML.根文档属性列表的开头:publicstaticvoidReorderDefaultNamespaceToBeginning(XElementxElement){varattrArray=xElement.Attributes().ToArray();intdefaultIndex=-1;for(inti=0;ifirstIndex){foreach(varattrinattrArray)attr.Remove();attrArray.Swap(defaultIndex,firstIndex);foreach(varattrinattrArray)xElement.Add(attr);}}publicstaticclassListHelper{publicstaticvoidSwap(thisT[]list,inti,intj){if(i!=j){Ttemp=list[i];列表[i]=列表[j];列表[j]=温度;}}}(这利用了未记录的事实,即名称空间前缀以出现的相反顺序进行检查。)完成后,将返回wf:前缀。以上是C#学习教程:XDocument保存和删除节点前缀共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: