1

我正在编写一个用于单元测试的函数。我想比较 XML 文件,但由于其中一个文件将由第三方库创建,因此我想减轻由于缩进不同而导致的任何可能差异。因此,我编写了以下函数:

private String normalizeXML(String xmlString) {
    String res = xmlString.replaceAll("[ \t]+", " ");
    // leading whitespaces are inconsistent in the resulting xmls.
    res = res.replaceAll("^\\s+", "");
    return res.trim();
}

但是,此函数不会删除 XML 每一行的前导间隔。

当我以这种方式编写函数时(第一个正则表达式的差异):

private String normalizeXMLs(String xmlString) {
    String res = xmlString.replaceAll("\\s+", " ");
    // leading whitespaces are inconsistent in the resulting xmls.
    res = res.replaceAll("^\\s+", "");
    return res.trim();
}

它确实删除了尾随空格,但它也使 xml 显示为单行,这在您需要比较差异时非常麻烦。

我只是无法证明为什么第一个实现不会取代领先区间。有任何想法吗?

编辑:更有趣的是,如果我进行单行操作:

String res = xmlString.replaceAll("^\\s+", "");

此行不会删除任何标识!

4

3 回答 3

5

与其尝试操纵字符串表示,不如使用专用的 XML 比较工具(例如XMLUnit )更安全,该工具允许您准确定义哪些差异是重要的,哪些不重要。尝试使用正则表达式修改 XML 数据很少是一个好主意,您应该使用正确的 XML 解析器,该解析器了解构成良好格式 XML 的所有规则。

于 2013-02-25T15:23:56.113 回答
0

也许:

String res = xmlString.replaceAll("[ \\t]+", " ");

不是\t...

于 2013-02-25T15:16:34.400 回答
0

这个对我有用:

    private static String normalizeXMLs(String xmlString) {
    String res = xmlString.replaceAll("\\t", "");
    return res.trim();
}

祝你好运 :)

于 2013-02-25T15:49:44.020 回答