簡體   English   中英

如何從java中的xml中提取某些塊?

[英]How to extract certain blocks from xml in java?

我有以下xml文件。

<?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>

我想只使用createTable提取塊,使用xpath將其解壓縮到其他xml文件。 結果應如下所示:

<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>

我現在的代碼現在仍然如下:

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());


}
}

我並不清楚如何遍歷xpath並提取所需的塊。

您需要使用NodeList

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;
}

這將返回阻止所有createTable塊。

//changeSet[createTable]

要么

/databaseChangeLog/changeSet[createTable]

在這里,您要求返回存在createTable的changeSet塊。

結果

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM