2017-10-31 17 views
0

xmlunit 2.5.0を使用しています。名前属性が一致するXMLUnitタグが一致しません

以下は私の2つのxml文字列です:1つはcontrolxmlであり、1つはtestxmlです。

ここでは、xmlunitを使用してこれら2つの文字列xmlを比較しています。

私のJavaコードは次のとおりです。

org.xmlunit.diff.Diff myDiff = DiffBuilder.compare(controlXml).withTest(testXml) 
        .checkForSimilar() 
        .withNodeMatcher(new 
        DefaultNodeMatcher(ElementSelectors.conditionalBuilder() 
           .whenElementIsNamed("f1") 
           .thenUse(ElementSelectors.byName) 
           .elseUse(ElementSelectors.byNameAndText) 
           .build())) 
        .build(); 

取得エラー:

*********************** 
Expected attribute value 'Roses' but was 'Daisy' - comparing <f1 name="Roses"...> at /flowers[1]/flower[1]/f1[1]/@name to <f1 name="Daisy"...> at /flowers[1]/flower[1]/f1[1]/@name (DIFFERENT) 
*********************** 
*********************** 
Expected attribute value 'Daisy' but was 'Roses' - comparing <f1 name="Daisy"...> at /flowers[1]/flower[2]/f1[1]/@name to <f1 name="Roses"...> at /flowers[1]/flower[2]/f1[1]/@name (DIFFERENT) 
*********************** 

私はローズはtestxmlに存在しているので、何のエラーを取得しないようにしたいです。なぜ私はtestxmlでバラがあり、私はElementSelectors.byNamewhenElementIsNamed("f1")を持っていますが、controlxmlのRoseはtestxmlのDaisyと比較されています。

どのElementSelectorを使用しますか?

+0

文字列controlXml = F1名= \" バラ\>" でありますf1 name = \ "Crocus \" /> "; – DonSenor

+0

文字列testXml = ""。 – DonSenor

答えて

0

あなた

.whenElementIsNamed("f1") 
.thenUse(ElementSelectors.byName) 

は、あなたの "F1" の要素がドキュメント順に比較になることを意味します。彼らは結局結局同じ名前を持っています。あなたは明らかにname属性の値が "f1"を比較するものであると感じています。 「f1」が兄弟である場合は、簡単な

.thenUse(ElementSelectors.byNameAndAttributes("name")) 

が有効です。 byNameAndAttributesは、要素名に加えて値が一致しなければならない属性のvarargsリストをとります。

残念ながら、それらは兄弟ではなく、ツリーをトラバースするときにどの「花」要素を選択するかをXMLUnitに通知する必要があります。 XMLUnitが間違った "花"を拾うと、あなたは同じことを考える "f1"を見ないでしょう。

あなたの例のための完全なソリューションは、 " デイジー\ "/> <

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder() 
    .whenElementIsNamed("flower") 
    .thenUse(ElementSelectors.byXPath("./f1", ElementSelectors.byNameAndAttributes("name"))) 
    .elseUse(ElementSelectors.byNameAndText) 
    .build())) 
+0

こんにちは、返信ありがとうございます。私はそれをorg.xmlunit.diff.Diffに変更しました.Diff myDiff = DiffBuilder.compare(controlXml).withTest(testXml) .checkForSimilar()//異なる順序は常に「類似」ではありません。 .withNodeMatcher(新しいDefaultNodeMatcher(ElementSelectors.conditionalBuilder() \t \t .whenElementIsNamed( "F1") \t \t .thenUse(ElementSelectors.byNameAndAttributes( "名前")) \t \t .elseUse(ElementSelectors.byName) \t \t .build())) 。ビルド();しかし、取得エラー: – DonSenor

+0

*********************** 予想子どもF1 'が、 'NULL' だった - /花は[1] /花でを比較します(異なる)[1]/F1 [1]〜 *********************** ************ *********** /null [花] [1]/flower [1]/f1 [1]のを比較して、 'null'であるが 'f1' ******************** *********************** 期待子供のF1 'しかし、 'NULL' だった - (DIFFERENT) に[1] /花[1] /花[2]/f1のを比較******************** *** 予想される子「null」がw 'F1' として - /花[1] /花[2] [1](DIFFERENT)/ F1、私は問題を見 – DonSenor

+0

を比較し、あなたの "F1" の要素がさらに別の要素にネストされている(私は彼らがするだろうと思いました兄弟である。試して答えを更新します。 –

関連する問題