我强烈建议您不要使用正则表达式来解析 XML,在这种情况下,您根本不应该使用正则表达式。
您需要的是一个好的 XML 解析器/流媒体框架,例如SAX或StaX(由于文件的大小,我会选择后者)。
您基本上会将您阅读的每个流媒体事件推送给作家。
一旦您characters
在使用阅读器实例解析文件时识别出一个事件,而不是直接编写它,您将每个符号替换为其实体,并编写替换String
的而不是原始的。
注意:这里有一个官方的StaX教程,可以帮助您入门。这是 JEE5 参考页面,其中包含附加信息。
为什么这样做而不是应用 aPattern
并用 a 解析整个文件BufferedReader
?
- 因为性能会很糟糕(重新匹配
Pattern
5MB 文件的每一行)
- 因为您
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("<", "<"));
System.out.println("GT: " + iWantToDie.group(1).replace(">", ">"));
System.out.println("AND: " + iWantToDie.group(1).replace("&", "&"));
}
输出:
Uugh: blah < > &
LT: blah < > &
GT: blah < > &
AND: blah < > <