使用XElement处理无效的XML字符

4
我有一个返回XElement对象的C# API。这个XElement对象是通过以下代码构建的 -
string invalidXML = "a \v\f\0";    
XElement fe = new XElement("Data", invalidXML);
Console.WriteLine(fe);

通过观察,我知道当尝试将无效的 XML 字符传递给上面的 XElement 构造函数时,会引发 System.Argument 异常。
所以事实证明,当传递包含无效 XML 字符的字符串时,XElement 不会抛出错误。如果您尝试通过 Console.WriteLine(fe) 打印 XElement,则会从 XMLWriter 收到异常。
System.ArgumentException: '', hexadecimal value 0x0B, is an invalid character.
   at System.Xml.XmlEncodedRawTextWriter.InvalidXmlChar(Int32 ch, Char* pDst, Boolean entitize)
   at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd)
   at System.Xml.XmlEncodedRawTextWriter.WriteString(String text)
   at System.Xml.XmlEncodedRawTextWriterIndent.WriteString(String text)
   at System.Xml.XmlWellFormedWriter.WriteString(String text)
   at System.Xml.Linq.ElementWriter.WriteElement(XElement e)
   at System.Xml.Linq.XElement.WriteTo(XmlWriter writer)
   at System.Xml.Linq.XNode.GetXmlString(SaveOptions o)
   at System.Xml.Linq.XNode.ToString()
   at System.IO.TextWriter.WriteLine(Object value)
   at System.IO.TextWriter.SyncTextWriter.WriteLine(Object value)
   at System.Console.WriteLine(Object value)
   at TestLoggingForUNIT.Program.Main(String[] args) in C:\Users\shivanshu\source\repos\TestLoggingForUNIT\TestLoggingForUNIT\Program.cs:line 29

对我来说,似乎XElement本身并不进行任何验证。在.NET中,当它被打印/序列化时,内部会调用XML writer,这时会抛出异常。
我的问题是,XElement是否保证如果传递了无效的XML字符就会抛出异常?
换句话说,我需要检查我传递的字符串是否存在无效的XML字符吗?使用类似XmlConvert.IsXmlChar(string)的东西?
我看了下面的链接,但没有找到令人满意的答案-

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/valid-content-of-xelement-and-xdocument-objects3


查看源代码:https://referencesource.microsoft.com/#System.Xml.Linq/System/Xml/Linq/XLinq.cs,3367036406d1344a,它似乎正在使用XmlWriter进行验证。 - jdweng
我在VS中逐步执行了.NET代码,它只是进入AddContentSkipNotify(),然后将其解析为字符串并返回。不确定您在哪里看到XmlWriter进行验证。 - sandunes90
在 GetXmlString 方法中 - jdweng
1个回答

1

XmlWriter 在验证编写的字符是否有效。在官方文档中,相关的 XmlWriter 配置在“数据一致性”部分中描述:

数据一致性

XML 编写器使用 XmlWriterSettings 类的两个属性来检查数据一致性:

CheckCharacters 属性指示 XML 编写器检查字符,并在任何字符超出 W3C 定义的合法范围时抛出 XmlException 异常。

ConformanceLevel 属性配置 XML 编写器检查被编写流是否符合由 W3C 定义的“XML 1.0 文档或文档片段”的规则。三个一致性级别在以下表格中描述。默认值为 Document。有关详细信息,请参阅 XmlWriterSettings.ConformanceLevel 属性和 System.Xml.ConformanceLevel 枚举。

是的,将 CheckCharacters 标志设置为 true,将确保在遇到非法字符时引发异常。

如果您想允许编写无效字符,则可以在XmlWriter的XmlWriterSettings中将CheckCharacters标志设置为false,这将防止抛出异常。通常,XmlWriter会将保留字符编码为字符实体(例如<&lt;)。此外,当标志设置为false时,XmlWriter将使用数字字符实体转义非法字符(例如\f&#xC;),以生成符合XML规范的文本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接