当前位置: 首页 > 面试题库 >

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

云欣嘉
2023-03-14
问题内容

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

<xml>
  ...
  <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description>
  ...
</xml>

如你所知,说明中包含(<THIS-IS-PART-OF-DESCRIPTION>)似乎是无效标签的内容。现在,此描述标签被称为是叶子标签,并且其中不应包含任何嵌套标签。无论如何,这仍然是一个问题,并且会在DocumentBuilder.parse(...)

我知道这是无效的XML,但是可以预期它是无效的。关于解析此类输入的方法有什么想法吗?


问题答案:

“ XML”比无效更糟糕–它的格式不正确;请参阅格式正确与有效XML。

对违法行为的可预测性进行非正式评估无济于事。该文本数据不是XML。没有一致的XML工具或库可以帮助你处理它。

选项,最可取的是:

  1. 让提供者最终解决问题。 要求格式正确的XML。(从技术上讲,格式良好的XML短语是多余的,但可能有助于强调。)
  2. 使用容忍标记解析器在解析为XML之前清除问题:

  3. Standalone: xmlstarlet具有强大的恢复和修复功能信誉:RomanPerekhrest

xmlstarlet fo -o -R -H -D bad.xml 2>/dev/null
  • **Standalone andC / C **: HTML Tidy也可以与XML一起使用。 Taggle是TagSoup到C 的移植。

  • PythonBeautiful Soup是基于Python的。请参阅解析器之间的差异部分中的注释。另请参阅此问题的答案,以获取更多有关处理Python中格式错误的标记的建议。另请参阅此答案以了解如何codecs.EncodedFile()用于清除非法字符。

  • JavaTagSoupJSoup专注于HTMLFilterInputStream可用于预处理清理。
    。净:
  • 可以禁用XmlReaderSettings.CheckCharacters来解决过去的非法XML字符问题。
  • @jdweng票据是XmlReaderSettings.ConformanceLevel可以被设置为 ConformanceLevel.Fragment使XmlReader可以读取XML格式良好的解析实体缺少根元素。
  • @jdweng还报告说XmlReader.ReadToFollowing(),有时可以用来工作,围绕XML语法的问题,但在#3下文附注违规警告。
  • Microsoft.Language.Xml.XMLParser据说是“容错的”。
  • PHP:请参阅DOMDocument :: $ recoverlibxml_use_internal_errors(true)。在这里看到很好的例子。
  • RubyNokogiri支持“ Gentle Well-Formedness ”
  • R:请参见htmlTreeParse()以了解R中的容错标记解析。
  • Perl:请参阅XML :: Liberal,这是“超级自由的XML解析器,用于解析损坏的XML”。

  • 使用文本编辑器手动将数据处理为文本,或使用字符/字符串功能以编程方式处理数据。以编程方式执行此操作的范围可能从棘手到不可能,因为似乎经常可以预测的事情并非如此- 打破规则很少受规则约束。

对于无效字符错误,请使用regex删除/替换无效字符:

  • PHPpreg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $s);
  • Rubystring.tr("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{D7FF}\u{E000‌​}-\u{FFFD}", ' ')
  • JavaScriptinputStr.replace(/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm, '')

  • 对于符,请使用正则表达式将匹配项替换为&:credit:blhsin,demo

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

请注意,上面的正则表达式不会考虑注释或CDATA部分。



 类似资料:
  • 2)尝试通过执行两个string_replace来修复JSON字符串 需要注意的一点是,JSON字符串很长(大约50KB),并且包含很多条目。

  • 问题内容: 我有一个使用JDOM和xpath解析XML文件的过程,如下所示: 以上工作正常。xpath表达式存储在属性文件中,因此可以随时更改它们。现在,我必须处理更多来自旧系统的xml文件,该旧系统将仅以4000字节的块发送xml文件。现有处理读取4000字节的块并将其存储在Oracle数据库中,每个块作为数据库中的一行(对遗留系统进行任何更改或将这些块存储为数据库中的行的处理都是不可能的) 。

  • 我有XML数据在数据库(不是文件),我需要解析它,以提供可能写测试来验证数据在XML xml(内容数据): [致命错误]:14:2:根元素后面的文档中的标记必须格式良好。org.xml.sax.SaxParseException;亚麻编号:14;专栏编号:2;根元素后面的文档中的标记必须格式良好。位于com.sun.org.apache.xerces.internal.parsers.dompar

  • 清除浏览器缓存并重新启动 恢复到GIT中当时正在工作的旧提交 重新启动终端 运行其他正常运行的rails应用程序

  • 问题内容: 我想使用Javascript 解析此内容。数据如下所示: 在线上的每个教程都教您如何使用Twitter解析JSON,但是我不太确定如何使用JSON解析。 我想在一个网站上进行设置,以查看NFL团队在一个有趣的项目中获得的分数,以及有关解析JSON的良好学习体验,因为我不太在乎Twitter的东西。 这可能吗?有什么好的入门教程吗?甚至一些起始代码? 问题答案: 一般来说,您可以使用 J

  • xmlns:tools=“http://schemas.android.com/tools” Android:layout_width=“match_parent” Android:layout_height=“match_parent” Android:background=“@color/greencolor” 我在这里添加了注释 工具:context=“.mainActivity”> 第6行