2015-04-07 4 views
0

Я работаю с файлами XML:org.w3c.dom.Document в JAVA

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<IDFS> 
     <sunnydry> 
      <idf>4.3562937</idf> 
      <nbrOfRep>1.0</nbrOfRep> 
     </sunnydry> 
     <bresnahan> 
      <idf>4.3562937</idf> 
      <nbrOfRep>1.0</nbrOfRep> 
     </bresnahan> 
     <half> 
      <idf>3.9534276</idf> 
      <nbrOfRep>5.7123914</nbrOfRep> 
     </half> 
</IDFS> 

и я использую эти функции для чтения любого IDF и nbrOfRep в слове

public float getIdfOfWordIndocument(String str) 
    { 
     try 
     { 
      return Float.parseFloat(document.getElementsByTagName(str.toLowerCase()) 
        .item(0).getChildNodes().item(0).getTextContent()); 
     } 
     catch(Exception e) 
     { 
      return 0.0f; 
     } 

    } 

    // To read nbr of reputation of a word 
    public float getNbrOfRepfWordIndocument(String str) 
    { 
     return Float.parseFloat(document.getElementsByTagName(str.toLowerCase()) 
       .item(0).getChildNodes().item(1).getTextContent()); 
    } 

Первый один дает ошибку, а второй дает неверный результат. Однако, когда я изменить код для этого:

public float getIdfOfWordIndocument(String str) 
     { 
      try 
      { 
       return Float.parseFloat(document.getElementsByTagName(str.toLowerCase()) 
         .item(0).getChildNodes().item(1).getTextContent()); 
      } 
      catch(Exception e) 
      { 
       return 0.0f; 
      } 

     } 

     // To read nbr of reputation of a word 
     public float getNbrOfRepfWordIndocument(String str) 
     { 
      return Float.parseFloat(document.getElementsByTagName(str.toLowerCase()) 
        .item(0).getChildNodes().item(3).getTextContent()); 
     } 

Обе функции работают очень хорошо, но я не мог понять, почему я должен сделать это изменение:

В 1: .item (0) -> .item (1) и в 2: .item (1) -> .item (3)

Я использую этот код для записи файла XML:

public void addToXML(String str, float idf, float nbrOfRep) 
      { 

       Element e = null; 
       Element name = null; 
       Element rootEle = (Element) document.getFirstChild(); 

       // create data elements and place them under root 
       name = document.createElement(str.toLowerCase()); 
       rootEle.appendChild(name); 

       e = document.createElement("idf"); 
       e.appendChild(document.createTextNode(Float.toString(idf))); 
       name.appendChild(e); 

       e = document.createElement("nbrOfRep"); 
          e.appendChild(document.createTextNode(Float.toString(nbrOfRep))); 
       name.appendChild(e); 

       // doc.appendChild(rootEle); 

       try{ 
        Transformer tr = TransformerFactory.newInstance().newTransformer(); 
        tr.setOutputProperty(OutputKeys.INDENT, "yes");    
        tr.setOutputProperty("{http://xml.apache.org/xslt}indent- amount","6"); 

       // send DOM to file    
try{ 
        tr.transform(new DOMSource(document), new StreamResult(      new FileOutputStream(filePath))); 
      } 
catch (FileNotFoundException e)    
{ 
        // TODO Auto-generated catch block 
        e.printStackTrace();   } 

      } 
catch (TransformerException te)   
{   
System.out.println(te.getMessage());   
} 
      }// end 
+1

В дополнение к ответу Робби: вы должны найти подэлементы по имени тега вместо того, чтобы просто получать дочерние узлы по индексу. Эти текстовые узлы могут исчезнуть, если XML отформатирован по-разному. Код будет более четким и надежным. –

ответ

1

Есть текстовые узлы между вашими элементами:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<IDFS> 
     <sunnydry><!-- Text node 0 here 
     --><idf>4.3562937</idf><!-- Text node 2 here 
     --><nbrOfRep>1.0</nbrOfRep> 
     </sunnydry> 
     <!-- ... --> 
</IDFS> 

Итак:

  1. Узел 0: текстовый узел
  2. Узел 1: idf элемент узла
  3. Node 2: текстовый узел
  4. Узел 3: nbrOfRep элементный узел
+0

Как я могу избежать этого? Как я могу их удалить? –

+0

Здесь представлено несколько решений: http://stackoverflow.com/questions/978810/how-to-strip-whitespace-only-text-nodes-from-a-dom-before-serialization –

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