2017-09-25 10 views
0

XMLUnit2を使用して2つのXMLを部分的に比較しようとしています。私はXpathの下で、要素intだけを比較しようとしました。しかし、私のテストは、booleanタグもチェックしているので失敗しました。XPATHでXMLUnit2を使用してxmlを比較するにはどうすればよいですか?

このテストに合格するにはどうすればよいですか?

@Test 
    public void diff_through_xPath(){ 
     String myControlXML = "<struct><boolean>false</boolean><int>3</int></struct>"; 
     String myTestXML = "<struct><boolean>true</boolean><int>3</int></struct>"; 

     ElementSelector childSelector = selectorForElementNamed("int", byXPath("//int", byName)); 

     Diff myDiffSimilar = DiffBuilder.compare(myControlXML).withTest(myTestXML) 
       .withNodeMatcher(new DefaultNodeMatcher(childSelector, byName)) 
       .checkForSimilar() 
       .ignoreWhitespace() 
       .build(); 

     assertFalse("XML similar " + myDiffSimilar.toString(), 
       myDiffSimilar.hasDifferences()); 


    } 

編集:はNodeFilterで 、私は比較から不要なノードを削除しました。しかし、Xpathを与え、XPathによって評価されたノードだけを比較する方法があります。

@Test 
    public void diff_through_xPath() { 
     String myControlXML = "<struct><boolean>false</boolean><int>3</int></struct>"; 
     String myTestXML = "<struct><boolean>true</boolean><int>3</int></struct>"; 

     Diff myDiffSimilar = DiffBuilder.compare(myControlXML).withTest(myTestXML) 
       .withNodeFilter(new Predicate<Node>() { 
        public boolean test(Node node) { 
         return !node.getNodeName().equals("boolean"); //ignores all child nodes from of 'a'. 
        } 
       }) 
       //.checkForSimilar() 
       .ignoreWhitespace() 
       .build(); 

     assertFalse("XML similar " + myDiffSimilar.toString(), 
       myDiffSimilar.hasDifferences()); 


    } 
+0

私はあなたが比較したいことを理解していますか分かりません。あなたは 'struct'をまったく比較したいのですか?単に' int'だけを比較したいですか? 'NodeMatcher'は、兄弟のセットのどのノードが互いに比較するかを決定するために使用され、どのノードが比較の対象となるかに全く影響を与えません。 'NodeFilter'を使って、望まないものを取り除きます。 –

+0

私は両方のXMLでちょうど 'int'タグを比較したいと思います。ブールタグが一致するかどうかは気にしません。 – Manoj

+0

私が編集したので、不要なノードを削除するためにNodefilterを使用できます。 Xpathを使って比較する方法はありますか? – Manoj

答えて

0

これが正しいアプローチであるかどうかわかりません。しかし、あなたからコメントを得るために、とにかくここに投稿されました。このようにして、XPathで評価されたXMLノードリストを比較することしかできません。

@Test 
    public void testXpath() throws Exception { 

     File controlFile = new File("src/test/resources/myControlXML.xml"); 
     File testFile = new File("src/test/resources/myTest.xml"); 


     Diff myDiff = DiffBuilder.compare(Input.fromDocument(getDocument("src/test/resources/myControlXML.xml", "/struct/int"))) 
       .withTest(Input.fromDocument(getDocument("src/test/resources/myTest.xml", "/struct/int"))) 
       .checkForSimilar().withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName)) 
       .ignoreWhitespace() 
       .build(); 

     assertFalse("XML similar " + myDiff.toString(), 
       myDiff.hasDifferences()); 
    } 

    public Document getDocument(String fileName, String xpathExpression) throws Exception { 
     File controlFile = new File(fileName); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder; 

     dBuilder = dbFactory.newDocumentBuilder(); 

     Document controlDoc = dBuilder.parse(controlFile); 
     controlDoc.getDocumentElement().normalize(); 

     XPath xPath = XPathFactory.newInstance().newXPath(); 

     NodeList nodes = (NodeList) xPath.compile(xpathExpression).evaluate(
       controlDoc, XPathConstants.NODESET); 

     Document newXmlDocument = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder().newDocument(); 
     Element root = newXmlDocument.createElement("root"); 
     newXmlDocument.appendChild(root); 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Node node = nodes.item(i); 
      Node copyNode = newXmlDocument.importNode(node, true); 
      root.appendChild(copyNode); 
     } 

     return newXmlDocument; 
    } 
+0

XMLUnitの[XPath抽象化](https://github.com/xmlunit/user-guide/wiki/XPath-Support)を使用していくつかの行を保存できましたが、これは今のところおそらくこれを行う最良の方法です。将来のリリースでは、 'Input'ビルダーはおそらく' NodeList'をソースとして、あるいは 'Source'とXPath式を受け入れて、カバーの下で同じタスクを実行するように変更できます。 –

関連する問題