我遇到了与这些主题中描述的问题类似的问题 1) Replace >, <, & chars that appear inside XML nodes 2) Regular expression to match ">", "<", "&" chars that appear inside XML nodes
我正在寻找一个在 Java 中工作的解决方案。 实际上,我有一个巨大的 XML 文件(~5 MB),我想用它们各自的实体(转义字符)替换特殊字符,而不更改 XML 标记。 一个典型的例子应该是:
<tag><anothertag>& < > </anothertag></tag> (before)
<tag><anothertag>& < > </anothertag></tag> (after).
提前致谢
最佳答案
我强烈建议您不要使用正则表达式来解析 XML,在这种情况下,您根本不应该使用正则表达式。
你需要的是一个好的XML解析器/流框架,比如SAX或StaX (由于文件的大小,我会选择后者)。
您基本上会将您读到的每个流媒体事件推送给作家。
一旦您在使用阅读器实例解析文件时识别出 characters
事件,您无需直接写入它,而是将每个符号替换为其实体,然后写入替换的 String
而不是原来的。
注:here是帮助您入门的官方 StaX 教程。 Here是 JEE5 引用页,其中包含附加信息。
为什么这样做而不是应用 Pattern
并使用 BufferedReader
解析整个文件?
- 因为性能会很糟糕(为 5MB 文件的每一行重新匹配
Pattern
) - 因为您的
模式
必须非常复杂(因此不可读,而且性能也很差)
有关正则表达式 XML 解析 VS 正确 XML 解析的更多 SO 文档 here 。
编辑
我还没有考虑过一个巨大的、完全畸形的 XML 文件的情况。 在这种情况下,流式传输框架可能无法使用,因为流式传输的文件首先不是有效的 XML。
如果您已经用尽了所有其他选择,您想捏紧 Nose ,使用 BufferedReader
,并执行类似的操作(需要大量详细阐述 - don不要从字面上理解):
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("<", "<"));
System.out.println("GT: " + iWantToDie.group(1).replace(">", ">"));
System.out.println("AND: " + iWantToDie.group(1).replace("&", "&"));
}
输出:
Uugh: blah < > &
LT: blah < > &
GT: blah < > &
AND: blah < > <
关于java - 替换 XML 节点内出现的 >、< 和 & 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19103620/