2015-10-20 5 views
5

Ich habe die folgende XML-Datei.Wie bestimmte Blöcke aus XML in Java extrahieren?

<?xml version="1.0" encoding="UTF-8"?> 
<databaseChangeLog> 
    <changeSet author="debdipta.h (generated)" id="1442927616936-399"> 
     <createTable tableName="SI_FORWARDING_EVENT_HISTORY_AU"> 
     <column name="FORWARDING_ID_O" type="NUMBER" /> 
     <column name="FORWARDING_ID_N" type="NUMBER" /> 
     <column name="ASSIGNMENT_ID_O" type="NUMBER" /> 
     <column name="ASSIGNMENT_ID_N" type="NUMBER" /> 
     <column name="PROCESS_INSTANCE_ID_O" type="NUMBER" /> 
     <column name="PROCESS_INSTANCE_ID_N" type="NUMBER" /> 
     <column name="ORIGINAL_USER_ID_O" type="NUMBER" /> 
     <column name="ORIGINAL_USER_ID_N" type="NUMBER" /> 
     <column name="FORWARD_FROM_USER_O" type="NUMBER" /> 
     <column name="FORWARD_FROM_USER_N" type="NUMBER" /> 
     <column name="FORWARD_TO_USER_O" type="NUMBER" /> 
     <column name="FORWARD_TO_USER_N" type="NUMBER" /> 
     <column name="COMMENTS_O" type="VARCHAR2(4000 CHAR)" /> 
     <column name="COMMENTS_N" type="VARCHAR2(4000 CHAR)" /> 
     <column name="XML_O" type="VARCHAR2(4000 CHAR)" /> 
     <column name="XML_N" type="VARCHAR2(4000 CHAR)" /> 
     <column name="CREATED_BY_O" type="NUMBER" /> 
     <column name="CREATED_BY_N" type="NUMBER" /> 
     <column name="CREATION_DATE_O" type="date" /> 
     <column name="CREATION_DATE_N" type="date" /> 
     <column name="AUDIT_TRAIL_REASON" type="VARCHAR2(1000 CHAR)" /> 
     <column name="TRANSACTION_TYPE" type="VARCHAR2(100 CHAR)" /> 
     </createTable> 
    </changeSet> 

    <changeSet author="deb.h" id="4588999797"> 
     <createView /> 
    </changeSet> 

    <changeSet author="deb.h" id="4588999797"> 
     <createTable /> 
    </changeSet> 

    <changeSet author="deb.h" id="4588999797"> 
     <createView /> 
    </changeSet> 
</databaseChangeLog> 

Ich möchte die Blöcke nur mit createTable extrahieren, um mit Xpath in eine andere XML-Datei extrahiert werden. Das Ergebnis sollte wie folgt aussehen:

<databaseChangeLog> 
<changeSet author="debdipta.h (generated)" id="1442927616936-399"> 
     <createTable tableName="SI_FORWARDING_EVENT_HISTORY_AU"> 
      <column name="FORWARDING_ID_O" type="NUMBER"/> 
      <column name="FORWARDING_ID_N" type="NUMBER"/> 
      <column name="ASSIGNMENT_ID_O" type="NUMBER"/> 
      <column name="ASSIGNMENT_ID_N" type="NUMBER"/> 
      <column name="PROCESS_INSTANCE_ID_O" type="NUMBER"/> 
      <column name="PROCESS_INSTANCE_ID_N" type="NUMBER"/> 
      <column name="ORIGINAL_USER_ID_O" type="NUMBER"/> 
      <column name="ORIGINAL_USER_ID_N" type="NUMBER"/> 
      <column name="FORWARD_FROM_USER_O" type="NUMBER"/> 
      <column name="FORWARD_FROM_USER_N" type="NUMBER"/> 
      <column name="FORWARD_TO_USER_O" type="NUMBER"/> 
      <column name="FORWARD_TO_USER_N" type="NUMBER"/> 
      <column name="COMMENTS_O" type="VARCHAR2(4000 CHAR)"/> 
      <column name="COMMENTS_N" type="VARCHAR2(4000 CHAR)"/> 
      <column name="XML_O" type="VARCHAR2(4000 CHAR)"/> 
      <column name="XML_N" type="VARCHAR2(4000 CHAR)"/> 
      <column name="CREATED_BY_O" type="NUMBER"/> 
      <column name="CREATED_BY_N" type="NUMBER"/> 
      <column name="CREATION_DATE_O" type="date"/> 
      <column name="CREATION_DATE_N" type="date"/> 
      <column name="AUDIT_TRAIL_REASON" type="VARCHAR2(1000 CHAR)"/> 
      <column name="TRANSACTION_TYPE" type="VARCHAR2(100 CHAR)"/> 
     </createTable> 
</changeSet> 

<changeSet author="deb.h" id="4588999797"> 
     <createTable></createTable> 
</changeSet> 
</databaseChangeLog> 

Der Code, den ich noch jetzt getan haben, ist wie folgt:

public class extractXML { 
    public static void main(String[] args)throws Exception{ 
     //String test=readXMLasString.convert("E:\\db.borilog.xml"); 
     DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db=dbf.newDocumentBuilder(); 
     Document doc=db.parse(new FileInputStream("E:\\db.borilog.xml")); 
     XPath xpath=XPathFactory.newInstance().newXPath(); 
     Node res=(Node) xpath.evaluate("databaseChangeLog/changeSet",doc,XPathConstants.NODE); 
     System.out.println(NodeToString(res)); 
    } 

public static String NodeToString(Node node)throws TransformerException{ 
    StringWriter buf=new StringWriter(); 
    Transformer xform=TransformerFactory.newInstance().newTransformer(); 
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    xform.transform(new DOMSource(node),new StreamResult(buf)); 
    return(buf.toString()); 


} 
} 

ich nicht undrstanding, wie durch die XPath-Schleife und extrahieren Sie die benötigten Bausteine.

+1

Mögliche Duplikat von [Wie XML lesen unter Verwendung von XPath in Java] (http://stackoverflow.com/questions/2811001/ how-to-read-xml-Verwenden von xpath-in-java) –

Antwort

0

Das würde zurückgeben Sie blockiert alle createTable Blöcke.

//changeSet[createTable] 

oder

/databaseChangeLog/changeSet[createTable] 

Hier fragen Sie ChangeSet Blöcke zurückzukehren, wo create existiert.

Ergebnis

<changeSet author="debdipta.h (generated)" id="1442927616936-399"> 
    <createTable tableName="SI_FORWARDING_EVENT_HISTORY_AU"> 
    <column name="FORWARDING_ID_O" type="NUMBER" /> 
    <column name="FORWARDING_ID_N" type="NUMBER" /> 
    <column name="ASSIGNMENT_ID_O" type="NUMBER" /> 
    <column name="ASSIGNMENT_ID_N" type="NUMBER" /> 
    <column name="PROCESS_INSTANCE_ID_O" type="NUMBER" /> 
    <column name="PROCESS_INSTANCE_ID_N" type="NUMBER" /> 
    <column name="ORIGINAL_USER_ID_O" type="NUMBER" /> 
    <column name="ORIGINAL_USER_ID_N" type="NUMBER" /> 
    <column name="FORWARD_FROM_USER_O" type="NUMBER" /> 
    <column name="FORWARD_FROM_USER_N" type="NUMBER" /> 
    <column name="FORWARD_TO_USER_O" type="NUMBER" /> 
    <column name="FORWARD_TO_USER_N" type="NUMBER" /> 
    <column name="COMMENTS_O" type="VARCHAR2(4000 CHAR)" /> 
    <column name="COMMENTS_N" type="VARCHAR2(4000 CHAR)" /> 
    <column name="XML_O" type="VARCHAR2(4000 CHAR)" /> 
    <column name="XML_N" type="VARCHAR2(4000 CHAR)" /> 
    <column name="CREATED_BY_O" type="NUMBER" /> 
    <column name="CREATED_BY_N" type="NUMBER" /> 
    <column name="CREATION_DATE_O" type="date" /> 
    <column name="CREATION_DATE_N" type="date" /> 
    <column name="AUDIT_TRAIL_REASON" type="VARCHAR2(1000 CHAR)" /> 
    <column name="TRANSACTION_TYPE" type="VARCHAR2(100 CHAR)" /> 
    </createTable> 
</changeSet> 
<changeSet author="deb.h" id="4588999797"> 
    <createTable /> 
</changeSet> 
+0

Es gibt nur einen createTable-Block zurück. –

+0

Es findet die erste Instanz der createTable, die es bekommen hat. –

+0

ist, weil Sie ein Problem in Ihrem XML haben. Es gibt 2 geschlossene changeSet in es geht eins nach dem anderen. –

1

Sie müssen NodeList verwenden:

NodeList nodeList = (NodeList)xpath.evaluate("//changeSet[createTable]",doc,XPathConstants.NODE); 
String[] results = new String[nodeList.getLength()]; 
for (int index = 0; index < nodeList.getLength(); index++) { 
    Node node = nodeList.item(index); 
    String nodeAsString = NodeToString(node); 
    results[index] = nodeAsString; 
} 
+0

Ja endlich gelöst das Problem. Danke für die Hilfe. –

Verwandte Themen