问题描述
我使用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());
编辑:在搜索.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);
}
}