如何解析无效(错误/不良格式)的XML?

jvh*_*she 17 java xml xml-validation xml-parsing

目前,我正在开发一项功能,涉及解析从另一个产品收到的XML.我决定对一些实际的客户数据进行一些测试,看起来其他产品允许来自用户的输入被认为是无效的.无论如何,我仍然需要尝试找出解析它的方法.我们正在使用javax.xml.parsers.DocumentBuilder,我收到的输入错误如下所示.

<xml>
  ...
  <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description>
  ...
</xml>
Run Code Online (Sandbox Code Playgroud)

正如您所知,描述中的内容似乎是无效的标记(<THIS-IS-PART-OF-DESCRIPTION>).现在,已知此描述标记是叶标记,并且不应在其中包含任何嵌套标记.无论如何,这仍然是一个问题,并产生例外DocumentBuilder.parse(...)

我知道这是无效的XML,但它可以预测无效.有关解析此类输入的方法的任何想法?

kjh*_*hes 21

那个"XML"比无效更糟糕- 它没有很好的形成 ; 看看Well Formed vs Valid XML.

对违法行为可预测性的非正式评估无济于事.该文本数据不是XML.没有符合要求的XML工具或库可以帮助您处理它.

选项,最首选:

  1. 让提供商解决他们的问题. 需要格式良好的XML.(从技术上讲,格式良好的XML这个短语是多余的,但可能对重点有用.)
  2. 使用容错标记解析器在解析为XML之前清除问题:

  3. 使用文本编辑器手动处理数据或使用字符/字符串函数以编程方式处理数据.以编程方式执行此操作的范围可能从棘手到不可能,因为看似可预测的通常不是 - 规则中断很少受规则约束.

    • 对于无效字符错误,请使用正则表达式删除/替换无效字符:
    • 对于&符号,使用正则表达式替换匹配preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $s);:credit:blhsin,demo

      &(?!(?:#\d+|#x[0-9a-f]+|\w+);)
      
      Run Code Online (Sandbox Code Playgroud)

    请注意,上述正则表达式不会考虑注释或CDATA部分.