我们的项目几天前已转换为使用XmlDocument中的XDocument,但我们发现在使用XDocument.Parse处理属性值中的XML实体时出现奇怪的行为,示例代码如下:
XML字符串:
string xml = @“< char symbol =”“�”“>”;
XmlDocument.LoadXml代码和结果:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
Console.WriteLine(xmlDocument.OuterXml);
结果:
< char symbol =“�” />
XDocument.Parse代码和异常:
XDocument xDocument = XDocument.Parse(xml);
Console.WriteLine(xDocument.ToString());
例外:
System.Xml.dll中发生了'System.Xml.XmlException'类型的第一次机会异常 '。',十六进制值0x00,是无效字符。第1行,第18位。 在System.Xml.XmlTextReaderImpl.Throw(例外e) 在System.Xml.XmlTextReaderImpl.Throw(String res,String [] args) 在System.Xml.XmlTextReaderImpl.Throw(Int32 pos,String res,String [] args) 在System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos,Boolean expand,StringBuilder internalSubsetBuilder,Int32& charCount,EntityType& entityType) 在System.Xml.XmlTextReaderImpl.ParseNumericCharRef(Boolean expand,StringBuilder internalSubsetBuilder,EntityType& entityType) 在System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue,EntityExpandType expandType,Int32& charRefEndPos) 在System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos,Char quoteChar,NodeData attr) 在System.Xml.XmlTextReaderImpl.ParseAttributes() 在System.Xml.XmlTextReaderImpl.ParseElement() 在System.Xml.XmlTextReaderImpl.ParseDocumentContent() 在System.Xml.XmlTextReaderImpl.Read() 在System.Xml.Linq.XDocument.Load(XmlReader reader,LoadOptions选项) 在System.Xml.Linq.XDocument.Parse(String text,LoadOptions options) 在System.Xml.Linq.XDocument.Parse(String text)
似乎是“�”是一个无效字符,因此我们将值更改为有效字符,例如“`”然后两种方法都运作良好。
有没有办法更改XDocument.Parse行为以忽略属性中的无效字符,如XmlDocument.LoadXml?
答案 0 :(得分:2)
根据this arctice,值 实际上无效。我自己经历过XDocument类遵循比XmlDocument更严格的XML标准(我认为这是一件好事)。
阅读文章,他们会提出如何解决该错误的建议。