2014-10-07 3 views
1

мне нужно извлечь некоторые узлы из файла XML, отформатированный таким образом:Извлечение некоторых узлов из XML файлов

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

Теперь предположим, что существуют и другие <comment> Elemente, которые имеют <lang>spanish</lang> в одном файле XML. Мне нужно создать два отдельных файла XML. Первые один со всем NODES имея ребенок <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 с количеством <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

+0

Хорошо, я буду копаться в этом. Я хотел бы также привести пример кода :) Большое спасибо! EDIT: Xstrem просто сериализует объект в XML, у меня уже есть XML. – Leo91

ответ

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> 

Надежда thi с поможет вам! Happy Hacking ;-)

+0

Спасибо, Роб! Я попробую сегодня вечером! +100! HH! – Leo91

Смежные вопросы