2012-10-10 38 views
9
<person> 
<firstname> 
<lastname> 
<salary> 
</person> 

這是我正在解析的XML。當我嘗試打印的人子元素的節點名稱, 我得到XML節點上的getNodeName()操作返回#text

文本

文本

姓氏

文本

工資

如何消除#text正在生成?

更新 - 這裏是我的代碼

try { 

    NodeList nl = null; 
    int l, i = 0; 
    File fXmlFile = new File("file.xml"); 
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    dbFactory.setValidating(false); 
    dbFactory.setIgnoringElementContentWhitespace(true); 
    dbFactory.setNamespaceAware(true); 
    dbFactory.setIgnoringComments(true); 

    dbFactory.setCoalescing(true); 


    InputStream in; 
    in = new FileInputStream(fXmlFile); 
    Document doc = dBuilder.parse(in); 
    doc.getDocumentElement().normalize(); 
    Node n = doc.getDocumentElement(); 

    System.out.println(dbFactory.isIgnoringElementContentWhitespace()); 
    System.out.println(n); 

    if (n != null && n.hasChildNodes()) { 
     nl = n.getChildNodes(); 

     for (i = 0; i < nl.getLength(); i++) { 
      System.out.println(nl.item(i).getNodeName()); 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+2

顯示編碼.. – swemon

+0

該代碼已經提供。請幫助 – coder

回答

5

setIgnoringElementContentWhitespace只有在使用setValidating(true),然後只有當XML文件你解析引用的解析器可以使用DTD制定出哪些whitespace-工作只有文本節點實際上是可以忽略的。如果您的文檔沒有DTD,那麼它會在安全方面發生錯誤,並假定沒有文本節點可以被忽略,所以當您遍歷子節點時,您必須編寫自己的代碼來忽略它們。

+0

非常感謝您的回覆。哪種方法更可取?編寫一個DTD或寫一個方法來忽略空白? – coder

+2

這不難去掉僅用於空白的文本節點(例如http://www.java.net/node/667186#comment-684625),這樣就避免了修改原始XML文件以添加DTD參考。 –

+0

這太棒了!非常感謝! – coder