使XmlReaderSettings CheckCharacters适用于xml字符串

问题描述 投票:1回答:1

我有一个来自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名称和文本内容是否有效,而不管属性设置如何。将CheckCharacters设置为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?

c# xml pdf pdf-form
1个回答
1
投票

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

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

  1. LL解析器可以手写。词法分析器和解析器都很简单。
  2. 可以使用ANTLR和简单语法生成LR解析器。最有可能的是,您甚至可以找到示例XML garmmars。
  3. 您还可以使用.NET XML解析器的任一源代码并删除不需要的验证。您可以在GitHub上的.NET Core存储库中找到XmlDocumentXDocument
© www.soinside.com 2019 - 2024. All rights reserved.