XmlDocument.Save与XDocument.Save

问题描述

我使用XmlDocument,XmlElement等进行了一些XML操作。 我使用XDocument,XElement等将其替换为代码,以使其现代化。 但是,元素的某些内部文本包含字符'\x4'。 使用XmlDocument.Save()可以将其另存为,即使使用第三方工具也可以正常工作。但是XDocument.Save()会抛出

System.ArgumentException: '',hexadecimal value 0x04,is an invalid character.
  + System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(int,System.Byte*,bool)
  + System.Xml.XmlUtf8RawTextWriter.WriteElementTextBlock(System.Char*,System.Char*)
  + System.Xml.XmlUtf8RawTextWriter.WriteString(string)
  + System.Xml.XmlUtf8RawTextWriterIndent.WriteString(string)
  + System.Xml.XmlWellFormedWriter.WriteString(string)
  + System.Xml.Linq.ElementWriter.WriteElement(System.Xml.Linq.XElement)
  + System.Xml.Linq.XElement.Writeto(System.Xml.XmlWriter)
  + System.Xml.Linq.XContainer.WriteContentTo(System.Xml.XmlWriter)
  + System.Xml.Linq.XDocument.Writeto(System.Xml.XmlWriter)
  + System.Xml.Linq.XDocument.Save(string,System.Xml.Linq.SaveOptions)
  + System.Xml.Linq.XDocument.Save(string)

我暂时使用XmlConvert.EncodeName(),但这会将其转换为_x0004_,除非使用XmlConvert.DecodeName()对其进行解码,否则将无法正确读取。

我可以实现以前的保存功能吗?

最小步骤:

    //ok
    Console.WriteLine(new XDocument(new XElement("test","aa")).ToString());
    //System.ArgumentException: '',is an invalid character.
    Console.WriteLine(new XDocument(new XElement("test","aa \x4")).ToString());

fiddle

编辑:在搜索.NET源代码时,我发现以前的正确行为可能是由私有XmlTextEncoder.WriteCharEntityImpl(string)完成的。但是,此类似乎未记录在案,我无法想象如何利用。

解决方法

通过使用XmlTextWriter进行保存,我找到了一种可接受的方式来实现自己的目标,因此我将其发布为我自己问题的答案。 但是,如果有仅使用LINQ-to-XML类的解决方案,我会更喜欢

using System;
using System.Xml;
using System.Xml.Linq;
                    
public class Program
{
    public static void Main()
    {
         var xdoc=new XDocument(new XElement("Params",new XElement("test","aa1 \x4")));
         using (var xw = new XmlTextWriter(Console.Out)
                {
                    Formatting=Formatting.Indented
                } )
                    xdoc.WriteTo(xw);   
    }
}

fiddle