2014-10-07 83 views
1

一些節點,我需要在這樣格式化的XML文件中提取一些節點:提取從XML文件

<collection sentiment="negativo"> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>blabla</text> 
    <lang>english</lang> 
    </comment> 

現在假設有其他<comment>元素系列,同樣的XML文件中有<lang>spanish</lang>。 我需要創建兩個單獨的XML文件。第一個與具有孩子<lang>english</lang>(讓我們eng.xml稱呼它),並具有<lang>spanish</lang>第二個所有節點(姑且稱之爲spa.xml)

這裏是我的Java代碼:

public void getEnglishRows() throws IOException{ 
    OutputStreamWriter f = new OutputStreamWriter(new FileOutputStream("C:/eclipse/neg_eng.xml")); 
    BufferedWriter buff; 

    NodeList current_row = doc.getElementsByTagName("comment"); //Mette in una lista tutti i nodi row (che contengono a loro volta degli elementi) 
    NodeList tmp; 
    Node nodo = null; 

    buff = new BufferedWriter(f); 
    for(int i=0;i< current_row.getLength();i++){ 
     tmp = current_row.item(i).getChildNodes(); 
     for(int k=0;k<tmp.getLength();k++){ 
      nodo = tmp.item(k); 

      if("english".equals(nodo.getTextContent())) 
       System.out.println("IF ENGLISH"); 
       buff.write(current_row.item(i).getNodeValue());       
     } 
    } 


    buff.close(); 
} 

我不知道我是否清楚,我希望如此。

所以我有一個Xml文件,其中LOTR爲<comment></comment>。我必須從這個全部<comment></comment>中提取出具有<lang>english</lang>的數據,並將節點(使用子節點)寫入另一個XML文件。 <lang>spanish</lang>的行爲相同。

eng.xml的輸出是:

<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>blabla</text> 
    <lang>english</lang> 
    </comment> 

spa.xml的輸出是:

<comment> 
     <sentiment> ...</sentiment> 
     <chars>...</chars> 
     <words>...</words> 
     <text>blabla</text> 
     <lang>spanish</lang> 
     </comment> 

我希望我是清楚的。我的問題是我可以提取所有節點的文本,但它不支持XML標記!

請幫幫我!

+0

調查jaxb或xstream – jgr208 2014-10-07 15:49:44

+0

好的,我會深入研究這一點。我還想要一些代碼示例:) 非常感謝!編輯:Xstrem只是將對象序列化爲XML,我已經有了一個XML。 – Leo91 2014-10-07 16:02:12

回答

0

爲什麼不嘗試刪除非英語評論? 所以我的建議是搜索標籤並檢測非英文標籤。然後轉到包含節點(元素)的父元素並將其刪除。這保留了原始文件結構。

試試看看這個代碼。它的工作對我來說:)

public void getEnglishRows() throws IOException, SAXException, ParserConfigurationException, TransformerException{  
    OutputStreamWriter f = new OutputStreamWriter(new FileOutputStream("./eng_sent.xml")); 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse(new FileInputStream("C:/eclipse/neg_eng.xml")); 

    NodeList current_row = doc.getElementsByTagName("lang"); // search for the lang element 

    for(int i=0;i< current_row.getLength();i++){    
     String lang = current_row.item(i).getTextContent(); 

     if (!lang.equalsIgnoreCase("english")) { 
      // delete not english comment 
      Element comment = (Element) current_row.item(i).getParentNode(); 
      doc.getDocumentElement().removeChild(comment); 
      doc.normalize(); 
     }   
    } 

    // write the content into xml file 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    DOMSource source = new DOMSource(doc); 
    StreamResult result = new StreamResult(f); 
    transformer.transform(source, result);  
} 

文件neg_eng就會出現類似如下:

<collection sentiment="negativo"> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>eng3</text> 
    <lang>english</lang> 
</comment> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>eng1</text> 
    <lang>english</lang> 
</comment> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>eng2</text> 
    <lang>english</lang> 
</comment> 

在原始的XML文件是:

<collection sentiment="negativo"> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>eng3</text> 
    <lang>english</lang> 
</comment> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>spa2</text> 
    <lang>spanish</lang> 
</comment> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>eng1</text> 
    <lang>english</lang> 
</comment> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>eng2</text> 
    <lang>english</lang> 
</comment> 
<comment> 
    <sentiment> ...</sentiment> 
    <chars>...</chars> 
    <words>...</words> 
    <text>spa1</text> 
    <lang>spanish</lang> 
</comment> 

希望提供s會幫助你! 快樂黑客;-)

+0

謝謝Rob!我今天晚上試試! +100! HH! – Leo91 2014-10-08 06:32:44