0

我有一个与这些主题中描述的问题类似的问题 1)替换出现在 XML 节点内的 >、< 和 & 字符 2)正则表达式以匹配出现在 XML 节点内的“>”、“<”、“&”字符

我正在寻找使用 Java 的解决方案。在实践中,我有一个巨大的 XML 文件(~5 MB),我想用它们各自的实体(转义字符)替换特殊字符,而不更改 XML 标记。一个典型的例子应该是:

<tag><anothertag>& < > </anothertag></tag> (before)
<tag><anothertag>&amp; &lt; &gt; </anothertag></tag> (after).

提前致谢

4

2 回答 2

2

我强烈建议您不要使用正则表达式来解析 XML,在这种情况下,您根本不应该使用正则表达式。

您需要的是一个好的 XML 解析器/流媒体框架,例如SAXStaX(由于文件的大小,我会选择后者)。

您基本上会将您阅读的每个流媒体事件推送给作家。

一旦您characters在使用阅读器实例解析文件时识别出一个事件,而不是直接编写它,您将每个符号替换为其实体,并编写替换String的而不是原始的。

注意:这里有一个官方的StaX教程,可以帮助您入门。是 JEE5 参考页面,其中包含附加信息。

为什么这样做而不是应用 aPattern并用 a 解析整个文件BufferedReader

  • 因为性能会很糟糕(重新匹配Pattern5MB 文件的每一行)
  • 因为您Pattern必须非常复杂(因此,不可读,并且性能不佳)

更多关于正则表达式 XML 解析 VS 正确 XML 解析的 SO文档

编辑

我没有考虑过巨大的、完全格式错误的 XML 文件的情况。在这种情况下,可能无法使用流式传输器框架,因为流式传输的文件首先不是有效的 XML。

如果您已经用尽所有其他选择,您想捏住鼻子,使用 a BufferedReader,然后做这样的事情(需要大量阐述 - 不要从字面上理解):

String killMe = "<element>blah < > &</element>";
// only valuable piece of info here: checks for characters within a node
// across multiple lines - again, needs a lot of work
Pattern please = Pattern.compile(">(.+)</", Pattern.MULTILINE);
Matcher iWantToDie = please.matcher(killMe);
while (iWantToDie.find()) {
    System.out.println("Uugh: " + iWantToDie.group(1));
    System.out.println("LT: " + iWantToDie.group(1).replace("<", "&lt;"));
    System.out.println("GT: " + iWantToDie.group(1).replace(">", "&gt;"));
    System.out.println("AND: " + iWantToDie.group(1).replace("&", "&amp;"));
}

输出:

Uugh: blah < > &
LT: blah &lt; > &
GT: blah < &gt; &
AND: blah < > &lt;
于 2013-09-30T21:00:50.923 回答
0

这是一个艰难的过程,因为据我所知,像 >< 这样的标记是 XML 内容的一部分,因此您的 XML 无效。我最好的建议是找到一个好的 xml 解析器,例如http://dom4j.sourceforge.net/dom4j-1.6.1/,并希望它可以处理您的问题。

于 2013-09-30T21:04:30.973 回答