1

単体テストに使用する関数を作成しています。XML ファイルを比較したいのですが、そのうちの 1 つがサード パーティのライブラリによって作成されるため、インデントの違いによる違いを軽減したいと考えています。したがって、次の関数を書きました。

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 が 1 行として表示されるため、違いを比較する必要がある場合に非常に厄介です。

最初の実装が先頭の間隔を置き換えない理由を正当化することはできません。何か案は?

編集:さらに興味深いのは、1行の操作を行う場合:

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

この行は識別を削除しません!

4

3 に答える 3

5

文字列表現を操作しようとするよりも、 XMLUnitなどの専用の XML 比較ツールを使用する方が安全です。このツールを使用すると、重要な違いとそうでない違いを正確に定義できます。正規表現を使用して XML データを変更しようとすることは、めったに良い考えではありません。整形式の XML を構成するすべての規則を認識している適切な XML パーサーを使用する必要があります。

于 2013-02-25T15:23:56.113 に答える
0

これは私のために働いた:

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

幸運を :)

于 2013-02-25T15:49:44.020 に答える
0

多分:

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

\t ではありません...

于 2013-02-25T15:16:34.400 に答える