2013-04-28 183 views
1

如何比較XML結構,忽略標記內容?比較兩個XML文件的結構

例如,以下響應:

<note> 
    <to>Adam</to> 
    <from>Eve</from> 
</note> 

和:

<note> 
    <to>John</to> 
    <from>Joan</from> 
</note> 

有相同的XML結構,但是:

<note> 
    <from>Joan</from> 
    <to>John</to> 
</note> 

是不是等同於第一例,因爲標籤的順序不同。

如何比較Java中的XPath結構?

+0

你看過XMLUnit嗎? http://xmlunit.sourceforge.net/ – 2013-04-28 09:40:28

+0

如果其中任何一個答案對您有幫助,請用「綠色」選中標記「接受」。 – 2016-09-07 16:32:37

回答

1

您可以使用JAVA的DOM解析或SAX解析器

下面一個例子後,要訪問元素,你需要做的正常比較

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 
import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.Node; 
import org.w3c.dom.Element; 
import java.io.File; 

public class ReadXMLFile { 

    public static void main(String argv[]) { 

    try { 

    File fXmlFile = new File("/Input.xml"); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(fXmlFile); 

    doc.getDocumentElement().normalize(); 

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 

    NodeList nList = doc.getElementsByTagName("staff"); 

    System.out.println("----------------------------"); 

    for (int temp = 0; temp < nList.getLength(); temp++) { 

     Node nNode = nList.item(temp); 

     System.out.println("\nCurrent Element :" + nNode.getNodeName()); 

     if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element eElement = (Element) nNode; 

      System.out.println("Note: " + eElement.getAttribute("note")); 
      System.out.println("From: " + eElement.getElementsByTagName("from").item(0).getTextContent()); 
      System.out.println("To : " + eElement.getElementsByTagName("to").item(0).getTextContent()); 

     } 
    } 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    } 

} 
+0

太好了。會試試看! – 2013-04-28 09:35:29

1

你可以計算爲XML結構中的散列值和比較兩個散列值。 StAX的簡單示例如下,示例僅關注開始和結束元素,您可能需要添加其他類型。它將散列值打印到控制檯而不是比較。

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.InputStream; 
import java.security.MessageDigest; 

import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.events.XMLEvent; 

public class ComputeXMLStructureHash { 

    public static void main(String[] args) 
    { 
     try { 
      FileInputStream in1 = new FileInputStream(new File("file1.xml")); 
      FileInputStream in2 = new FileInputStream(new File("file2.xml")); 
      FileInputStream in3 = new FileInputStream(new File("file3.xml")); 

      System.out.println(digest(in1)); 
      System.out.println(digest(in2)); 
      System.out.println(digest(in3));       

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static String digest(InputStream in) { 
     MessageDigest messageDigest = null; 

     // StAX for XML parsing 
     XMLInputFactory inputFactory = XMLInputFactory.newFactory(); 

     try { 
      messageDigest = MessageDigest.getInstance("MD5"); 
      XMLEventReader eventReader = inputFactory.createXMLEventReader(in); 

      // Iterate over the XML elements and update hash 
      while (eventReader.hasNext()) { 
       XMLEvent event = eventReader.nextEvent(); 

       if (event.isStartElement()) { 
        messageDigest.update(event.asStartElement().getName().toString().getBytes());     
       } else if (event.isEndElement()) { 
        messageDigest.update(event.asEndElement().getName().toString().getBytes()); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     StringBuffer result = new StringBuffer(); 
     byte[] digest = messageDigest.digest(); 
     for (byte b : digest) 
      result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); 

     return result.toString(); 
    } 
}