7

私はxmlファイルにabc.xmlと123.xmlを言う必要があります。これはほとんど同じです。つまり、同じコンテンツが含まれていますが、2番目のファイル(123.xml)には以前のファイルよりも多くのコンテンツが含まれています。Javaを使用して両方のファイルを読み取り、各タグのabc.xmlに存在するコンテンツが123.xmlのコンテンツと同じであるかどうかを比較します。これは、オブジェクトの比較のようなものです。javaを使用してxmlファイルを読み取り、比較を開始する方法を教えてください。

ありがとう。

4

7 に答える 7

13

比較したいだけなら、これを使用してください:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setCoalescing(true);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setIgnoringComments(true);
DocumentBuilder db = dbf.newDocumentBuilder();

Document doc1 = db.parse(new File("file1.xml"));
doc1.normalizeDocument();

Document doc2 = db.parse(new File("file2.xml"));

doc2.normalizeDocument();
Assert.assertTrue(doc1.isEqualNode(doc2));

それ以外の場合は、この http://xmlunit.sourceforge.net/を参照してください

于 2012-04-25T08:05:35.780 に答える
5

XMLUnitを選びます。それが提供する機能:

  • 2つのXMLの違い
  • XSLTを使用してXMLの一部を変換した結果
  • XMLの一部でのXPath式の評価
  • XMLの一部の有効性
  • DOMトラバーサルによって公開されるXMLの一部の個々のノード

幸運を!

于 2012-04-25T08:06:20.743 に答える
4

JAXBを使用してXMLファイルからJavaオブジェクトを生成し、Javaファイルを比較します。それらは取り扱いをはるかに簡単にするでしょう。

于 2012-04-25T08:04:43.030 に答える
3

一般に、構造が同じでコンテンツがわずかに異なり、順序付けされていない2つのファイルがあることがわかっている場合は、ファイルを「読み取って」コンテンツを比較する必要があります。

XMLファイル用のXMLスキーマがある場合は、JAXBを使用して、XMLスキーマによって定義された特定のDOMを表すクラスのセットを作成できます。このアプローチの利点は、要素と属性のジェネリック関数ではなく、問題に意味のある実際のフィールドを介してXMLファイルを解析する必要がないことです。

もちろん、両方のファイルで同じエントリの存在を検出できるようにするには、いくつかの共通フィールド(たとえば、いくつかのID)を介してそれらを「一致」させる必要があります。

重複の検出プロセスを支援するために、 Set(またはその派生物の1つ)など、Javaのコレクションからの関連するデータ構造を使用できます。

これがお役に立てば幸いです。

于 2012-04-25T08:12:44.463 に答える
1

比較して表示したいだけなら、Guiffyを使うことができます

それは良いツールです。バックエンドで処理を実行する場合は、DOMパーサーを使用して両方のファイルを2つのDOMオブジェクトにロードし、属性ごとに比較する必要があります。

于 2012-04-25T08:00:17.367 に答える
1

適切なアプローチは、次の2つの要因によって異なります。

(a)比較がどのように行われるかをどの程度制御したいですか?たとえば、空白が重要かどうか、コメントを無視するかどうか、名前空間プレフィックスを無視するかどうか、冗長な名前空間宣言を無視するかどうか、XML宣言を無視するかどうかを制御する必要がありますか?

(b)どのような答えが欲しいですか?(i)ブール値:同じ/異なる、(ii)人間が処理するのに適した違いのリスト、(iii)アプリケーションが処理するのに適した違いのリスト。

私が使用する2つの手法は、次のとおりです。(a)両方のファイルをCanonical XMLに変換してから、文字列を比較します。これはほとんど制御を与えず、ブール結果を与えるだけです。(b)XPath 2.0のdeep-equal()関数または拡張Saxonバージョンのsaxon:deep-equal()を使用して2つのツリーを比較します。Saxonバージョンでは、比較の実行方法をより細かく制御でき、見つかった違いのより詳細なレポートが提供されます(アプリケーションでの使用ではなく、人間が読むため)。

もちろん、Javaコードを記述したい場合は、独自の比較ロジックを実装することもできます。たとえば、XPathのオープンソース実装をディープイコールで見つけて、要件を満たすように変更することができます。たった100行ほどのコードです。

于 2012-04-25T08:38:12.113 に答える
0

少しやり過ぎですが、XMLにスキーマがある場合は、それをEMFメタモデルに変換してから、EMFCompareを使用して比較できます。

于 2012-04-25T08:07:18.833 に答える