XDocument.Save()删除了我的 缺少属性/值),使用C#和Linq-to-XML。该工具将现有的XML文件加载到XDocument对象中。然后它通过节点向下解析以插入丢失的数据。之后,它调用XDocument.Save()将更改保存到另一个目录。所有这一切都很好,除了一件事:任何 XML文件中文本中的实体将替换为换行符。当然,该实体代表一个新行,但我需要将该实体保留在XML中,因为另一个消费者需要它。有没有办法保存修改后的XDocument而不会丢失 实体?谢谢。 实体在XML中在技术上称为“数字字符引用”,它们在原始文档加载到XDocument时被解析。这使您的问题悬而未决,因为在加载XDocument之后,无法将已解析的空白实体与无意义的空白区分开来(通常用于为纯文本查看器格式化XML文档)。因此,以下仅适用于您的文档,没有任何无关紧要的空白。System.Xml库允许通过将XmlWriterSettings类的NewLineHandling属性设置为NewLineHandling来保留空白实体。但是,在文本节点中,这只是将r分配给 ,而不是n到 .最简单的解决方案是派生自XmlWriter类并覆盖其WriteString方法,以手动将空白字符替换为其数字字符实体。WriteString方法也恰好是.NET要求不允许出现在文本节点中的字符的地方,例如语法标记&和>,它们分别被授权给&、<、>。由于XmlWriter是抽象的,我们将从XmlTextWriter派生以避免必须实现前一个类的所有抽象方法。这是一个快速而肮脏的实现:publicclassEntitizingXmlWriter:XmlTextWriter{publicEntitizingXmlWriter(TextWriterwriter):base(writer){}publicoverridevoidWriteString(stringtext){foreach(charcintext){switch(c){case'r':case'n':case't':base.WriteCharEntity(c);休息;默认值:base.WriteString(c.ToString());休息;}}}}如果打算用于生产,则需要c.ToString()部分,因为它效率很低。您可以通过批处理不包含您要授权的任何字符的原始文本子字符串并将它们一起送入单个base.WriteString调用来优化您的代码。警告:以下天真的实现将不起作用,因为底层WriteString方法将用&替换任何&字符&从而将r扩展为 .publicoverridevoidWriteString(stringtext){text=text.Replace("r"," ");text=text.Replace("n"," ");text=text.Replace("t","");base.WriteString(text);}最后,要将XDocument保存到目标文件或流,只需使用以下代码片段:using(vartextWriter=newStreamWriter(destination))using(varxmlWriter=newEntitizingXmlWriter(textWriter))document.Save(xmlWriter);希望这有帮助!编辑:作为参考,这里是重写的WriteString方法的优化版本:publicoverridevoidWriteString(stringtext){//下一个仅包含非实体化字符的子字符串的起始索引。intstart=0;//正在检查的当前字符的索引。for(intcurr=0;curr如果您的文档包含无关紧要的空格,则您想和它比较 实体,您可以使用以下(更简单的)解决方案:转换 该字符临时引用另一个字符(尚未出现在文档中),执行XML处理,并在输出结果中转换回该字符。在下面的示例中,我们将使用私有字符U+E800。静态字符串ProcessXml(字符串输入){input=input.Replace(" ","?");XDocumentdocument=XDocument.Parse(input);//TODO:在这里执行XML处理。stringoutput=document.ToString();returnoutput.Replace("uE800"," ");}请注意,由于XDocument将数字字符引用解析为它们对应的Unicode字符,因此"?"实体将在输出中解析为'uE800'。通常,您可以安全地使用Unicode的“私有区域”(U+E000–U+F8FF)。如果你想更加安全,请检查该字符是否已存在于文档中;如果是,请从上述范围中选择另一个字符。因为你只是在做临时和内部使用的字符,所以你使用哪个并不重要。在极不可能的情况下,文档中已经存在所有私有字符,抛出异常;但是,我怀疑这会在实践中发生。以上是C#学习教程:XDocument.Save()删除了我分享的所有内容 不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
