【问题标题】:Java library to escape/clean XML?转义/清理 XML 的 Java 库?
【发布时间】:2012-01-19 08:06:08
【问题描述】:

我得到一些格式错误的 xml 文本输入,例如:

"<Tag>something</Tag> 8 > 3, 2 < 3, ... <Tag>something</Tag>"

我想清理输入以便得到:

"<Tag>something</Tag> 8 &gt; 3, 2 &lt; 3, ... <Tag>something</Tag>"

也就是说,转义像 这样的特殊符号,但保留有效标签(“&lt;Tag&gt;something&lt;/Tag&gt;,注意,大小写相同)

你知道有什么 java 库可以做到这一点吗?可能是 xml/html 解析器? (虽然我真的不需要解析器,简单的“干净”过程)

【问题讨论】:

  • 孤儿 '>' 字符不是问题。但是你怎么知道一个特定的 'always 后跟一个不是 XML 中的 Name 的数字吗?
  • 它们不是我的 xml 文档,也没有架构。不幸的是,我发现了一个“

标签: java html xml tags escaping


【解决方案1】:

JTidy 是“HTML 语法检查器和漂亮的打印机。像它的非 Java 表亲一样,JTidy 可以用作清理格式错误和错误 HTML 的工具”

但它也可以与 xml 一起使用。检查文档。它非常聪明,它可能对你有用。

【讨论】:

    【解决方案2】:

    我不知道有哪个图书馆可以做到这一点。您的输入是格式错误的 XML,并且没有适当的 XML 解析器会接受它。更重要的是,并不总是能够将实际标签与看起来像标签但实际上是文本的东西区分开来。因此,您为解决问题所做的任何基于启发式的尝试都是脆弱的;即它偶尔会产生格式错误的 XML。

    最好的方法是在组装 XML 之前解决问题。

    • 如果您通过(例如)反解析 DOM 来生成 XML,则反解析器会为您处理转义。
    • 如果您通过模板或字符串 bashing 生成 XML,那么您需要在相关文本块上调用 StringEscapeUtils.escapeXml 之类的东西......在 XML 标记被合并之前。

    如果您将问题留到“XML”组装完成后,则无法正确修复。

    【讨论】:

    • 我不组装 XML。你是对的,任何基于启发式的尝试最终都可能失败。然而,我认为/希望像 @gatkin 这样的解决方案能够满足我的输入。
    • “我不组装 XML” - 那么最好的解决方案是 reject 格式错误的 XML。使用您最喜欢的 XML 验证器来提供书面证据。互操作性标准是标准,不符合这些标准的软件是有缺陷的,应该予以修复……不予补偿。
    • 我爬取并获取生物信息学数据库提供的一些数据,我必须得到这些数据。不过,我同意你的观点。
    【解决方案3】:

    最好的解决方案是修复生成文本输入的程序。最简单的此类修复将涉及一个转义实用程序,就像建议的其他答案一样。如果这不是一个选项,我会使用像

    这样的正则表达式
    </?[a-zA-Z]+ */?>
    

    匹配预期的标签,然后将字符串拆分为标签(您希望不改变地通过)和标签之间的文本(您希望应用转义方法。)

    我不会指望 XML 解析器能够为您做这件事,因为您正在处理的不是有效的 XML。现有的缺乏转义可能会产生歧义,因此您可能也无法完成完美的工作。

    【讨论】:

    • 是的,我想这将是最简单的解决方案。
    【解决方案4】:

    查看 Guava 的 XmlEscaper。它是第 11 版的预发布版本,但代码可用。

    【讨论】:

    • 没有。 (至少从我在代码中读到的内容)像 StringEscapeUtils.escapeXml 一样,一切都被转义了,适当标签的特殊符号也是如此。
    • special symbols of proper tags 是什么意思?
    • 看,'something'的特殊符号不应该被转义
    • 我不明白你的意思。 XML 中的所有内容都在 SOME 标记内。在您的示例中,8 &gt; 3, 2 &lt; 3, ... 位于 Tag 的父标记的内容中,就像 somethingTag 标记的内容一样。 XML 解析没有区别。似乎您正试图放置任何库都不支持的任意区别。
    • 对,这是错误的 XML 语法,这就是我说我需要清理输入的原因。清洁工应该明白8 &gt; 3, 2 &lt; 3 中的那些特殊符号不会打开新标签,应该转义。也许我错了,这实际上是 HTML,但这将是我的用例。
    【解决方案5】:

    Apache Commons Lang 包含一个名为 StringEscapeUtils 的类,它完全符合您的要求!你想使用的方法是escapeXml,我想。

    【讨论】:

    • 没有。它转义了所有内容,以及正确标签的 符号。这是因为它不理解 xml 结构,而是使用简单的字符串替换。
    • 嗯,如果我想更多关于它...取决于您想对输入做什么,最好使用 XML 解析器对其进行解析。我怀疑仅对字符串进行操作的工具知道作为标签一部分的 与作为简单文本一部分的那些之间的区别。此外,使用解析器可以进一步处理输入。不过,我不知道你的确切用例。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多