【问题标题】:Making XmlReaderSettings CheckCharacters work for xml string使 XmlReaderSettings CheckCharacters 适用于 xml 字符串
【发布时间】:2018-07-10 00:16:20
【问题描述】:

我有一个来自 Adob​​e 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?

【问题讨论】:

  • 您不必使用 XmlReader。试试 StringReader,它不会做所有的检查。仍然可以加载 Xdocument.Load(stringReader) 或使用 Parse 读取字符串:XDocument.Parse(string);
  • @jdweng 我已经尝试过了,正如您从我问题中的代码 sn-ps 中看到的那样,但这会产生 XmlException。

标签: c# xml pdf pdf-form


【解决方案1】:

即使“看起来”像 XML,您也无法让标准 XML 解析器解析您的格式,停止尝试。不允许符合标准的 XML 解析器解析无效的 XML。这是一个设计决定,基于 HTML 解析引起的所有问题 quirks 模式。

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2017-01-06
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多