2013-04-28 3 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/ –

+0

위의 답변 중 하나라도 도움이 되었다면 녹색 체크 표시로 "동의"하십시오. –

답변

1

당신은 JAVA DOM 구문 분석 또는 SAX 파서를 하나 아래

당신은 당신은 XML 구조의 해시 값을 계산할 수

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

좋습니다. 시도해 볼게요! –

1

비교 정상해야 할 그 후 요소에 액세스 할 예하고 사용할 수 있습니다 두 해시 값을 비교하십시오. 아래 예제와 같이 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(); 
    } 
}