2011-12-13 58 views
2

我得到一些异常的XML文本输入,如:Java库逃脱/清理XML?

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

我要清理输入这样得到:

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

也就是说,逃避这些特殊符号像<,>时,仍能保留有效的标签(“​​,请注意,在同一个案例中)

你知道任何java库可以做到这一点吗? “程序)

+0

孤儿'>'字符不是问题。但是,如何判断一个特定的'<'字符是一个标签还是一个小于符号? XML文档是否遵循单个DTD或XML Schema?或者,'<'*总是*后面跟着一个不是XML中的'Name'的数字吗? – erickson

+0

他们不是我的XML文档,也没有模式。不幸的是,我发现一个“<”符号没有被一个空格或数字跟随的情况... – juanmirocks

回答

6

JTidy是“HTML语法检查器和漂亮的打印。就像它的非Java表弟,JTidy可以作为清理恶意和错误的HTML工具”

但它也可以用XML使用。检查文档。这是令人难以置信的聪明,它可能会为你工作。

0

查看番石榴的XmlEscaper。它在版本11的预发布中,但代码可用。

+0

编号(至少从我读的代码中)像StringEscapeUtils.escapeXml一样,一切都被转义了,标签。 – juanmirocks

+0

“适当标签”的特殊符号是什么意思? –

+0

看,'东西'的特殊符号不应该逃脱 – juanmirocks

-1

Apache Commons Lang包含一个名为的类StringEscapeUtils它正是你想要的!我想要使​​用的方法是escapeXml

+0

不可以。它逃避一切,也是适当标签的<,>符号。这是因为它不理解xml结构,而是使用简单的字符串替换。 – juanmirocks

+0

嗯,如果我对它有更多的了解...取决于你想用输入做什么,最好用XML解析器解析它。我怀疑只用字符串操作的工具知道作为标签一部分的< and >与作为简单文本一部分的工具之间的区别。另外,使用解析器可以让你进一步处理输入。不过,我不知道你的确切用例。 – r3nj1

1

最好的解决方案是修复生成文本输入的程序。最简单的这种修复将涉及像其他答案建议的转义实用程序。如果这不是一种选择,我会使用一个正则表达式像

</?[a-zA-Z]+ */?> 

以匹配预期的标签,然后分割字符串成之间的广告代码(您想通过不变)和文本(反对你想申请一个逃生方法。)

我不会指望XML解析器能够为你做,因为你正在处理的是不是有效的XML。现有的逃避行为可能会产生歧义,因此您可能无法做出完美的工作。

+0

是的,我想这将是最简单的解决方案。 – juanmirocks

2

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

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

  • 如果您通过(例如)解析DOM来生成XML,那么unparser将负责为您转义。
  • 如果您通过模板或字符串打击生成XML,则需要在XML标记合并之前在相关文本块上调用类似StringEscapeUtils.escapeXml的东西。

如果您在“XML”组装完成后才能解决问题,则无法正确修复该问题。

+0

我不组装XML。你是对的,任何基于启发式的尝试最终都会失败。然而,我认为/希望象@gatkin这样的解决方案能够为我获得的输入做出贡献。 – juanmirocks

+0

*“我不组装XML”* - 那么最好的解决方案是*拒绝* XML格式错误。使用您最喜爱的XML验证器来提供书面证据。互操作性标准是标准,不符合它们的软件是**越野车**,应该修复......不予补偿。 –

+0

我抓取并获取生物信息学数据库提供的一些数据,我必须得到这些数据。不过,我明白你的观点。 – juanmirocks