使 XmlReader Settings CheckCharacter 适用于 xml 字符串



我有一个来自Adobe PDF AcroForms的xml字符串,它显然允许以数字字符开头命名表单字段。我正在尝试将此字符串解析为 XDocument:

XDocument xDocument = XDocument.Parse(xmlString);

但是每当我遇到名称以数字字符开头的表单字段时,xml 解析都会抛出 XmlException:

名称不能以"数字"字符开头

我发现的其他解决方案是关于使用:XmlReaderSettings.CheckCharacters。

using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString), new XmlReaderSettings() { CheckCharacters = false }))
{
XDocument xDocument = XDocument.Load(xmlReader);
}

但这也没有奏效。一些文章指出了MSDN文章中提到的原因之一:

如果 XmlReader 正在处理文本数据,则它始终检查 XML 名称和文本内容有效,无论属性如何 设置。将检查字符设置为 false 将关闭字符检查 对于字符实体引用。

所以我尝试使用:

using(MemoryStream memoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xmlString)))
using (XmlReader xmlReader = XmlReader.Create(memoryStream, new XmlReaderSettings() { CheckCharacters = false }))
{
XDocument xDocument = XDocument.Load(xmlReader);
}

这也行不通。 任何人都可以帮助我弄清楚如何解析包含名称以数字字符开头的 xml 元素的 xml 字符串吗? 应该如何使用标志 XmlReaderSettings.CheckCharacters?

你不能让标准的XML解析器解析你的格式,即使它"看起来像"XML,停止尝试。不允许符合标准的 XML 解析器解析无效的 XML。这是一个设计决策,基于HTML解析引起的所有怪癖模式问题。

编写自己的解析器并不难。XML 非常严格,除非您需要高级功能,否则语法很简单。

  1. LL解析器可以手动编写。词法分析器和解析器都很简单。

  2. LR解析器可以使用ANTLR和简单的语法生成。最有可能的是,您甚至会找到示例 XML garmmars。

  3. 您也可以只获取 .NET XML 分析器的源代码之一,并删除不需要的验证。您可以在 GitHub 上的 .NET Core 存储库中找到XmlDocumentXDocument

最新更新