2011-04-06 69 views
1

我有一個簡單的XML表示下面的表格。當我遍歷最高級別時,使用代碼(包含在下面)。我得到5個節點,實際上在提供的示例中只有2個節點(theader和tbody)。有人可以解釋爲什麼嗎?爲什麼Java中的XML Dom會報告額外的節點?

package testparser; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.util.Vector; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class TestParser { 
    private static final int FILE_small = 1; 
    private static final int FILE_medium = 2; 
    private static final int FILE_large = 3; 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     doDomTest(1); 

    } 
    private static void doDomTest(int sizeId) { 
     String filename = getFileNameFromId(sizeId); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     try { 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      FileInputStream fis = new FileInputStream(filename); 
      Document doc = db.parse(fis); 

      Element topElement = doc.getDocumentElement(); 

      NodeList nl = topElement.getChildNodes(); 

      int ilen = nl.getLength(); 
      print("Top Element count " + ilen); 
      for (int i=0;i<ilen;i++){ 
       Node node = nl.item(i); 
       if (node.getNodeType()==Node.TEXT_NODE) { 
        print(i + ". Name:" + node.getNodeName() + "= " + node.getNodeValue() + ". type " + node.getNodeType()); 
       } else { 
        print(i + ". Name:" + node.getNodeName() + ", type " + node.getNodeType()); 
       } 
      } 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 


    private static String getFileNameFromId(int sizeId) { 
     String sReturn = ""; 
     switch (sizeId) { 
     case FILE_small: 
      sReturn = "D:/temp/testdata_ok.xml"; 
      break; 
     case FILE_medium: 
      sReturn = "D:/temp/testdata_ok.xml"; 
      break; 
     case FILE_large: 
      sReturn = "D:/temp/testdata_ok.xml"; 
      break; 
     } 
     return sReturn; 
    } 

    private static void print(String sValue) { 
     System.out.println(sValue); 
    } 
} 

TEST DATA

<?xml version="1.0" encoding="utf-8"?> 
<table> 
    <theader> 
     <tr> 
      <th>Title Col1</th> 
      <th>Title Col2</th> 
      <th>Title Col3</th> 
      <th>Title Col4</th> 
     </tr> 
    </theader> 
    <tbody> 
     <tr> 
      <td>data:R1C1</td> 
      <td>data:R1C2</td> 
      <td>data:R1C3</td> 
      <td>data:R1C4</td> 
     </tr> 
     <tr> 
      <td>data:R2C1</td> 
      <td>data:R2C2</td> 
      <td>data:R2C3</td> 
      <td>data:R2C4</td> 
     </tr> 
     <tr> 
      <td>data:R3C1</td> 
      <td>data:R3C2</td> 
      <td>data:R3C3</td> 
      <td>data:R3C4</td> 
     </tr> 
     <tr> 
      <td>data:R4C1</td> 
      <td>data:R4C2</td> 
      <td>data:R4C3</td> 
      <td>data:R4C4</td> 
     </tr> 
     <tr> 
      <td>data:R5C1</td> 
      <td>data:R5C2</td> 
      <td>data:R5C3</td> 
      <td>data:R5C4</td> 
     </tr> 
    </tbody> 
</table> 

控制檯輸出

Top Element count 5 
0. Name:#text= 
    . type 3 
1. Name:theader, type 1 
2. Name:#text= 
    . type 3 
3. Name:tbody, type 1 
4. Name:#text= 
. type 3 

注意如何THEADER和TBODY(線1和3)中報告了輸出,但我也有項0,2,和4.爲什麼額外的節點?我會預期只有分別爲theader和tbody列出0和1的行。

「類型1」/「類型3」表示也在輸出中打印的「getNodeType()」方法的值。我發現getNodeType()的含義是here

我使用JDK 1.6.0u24

回答

5

三個額外的節點是代表空白文本節點:

  • </theader><tbody>之間

    • <theader>之間<table>,並且
    • </tbody></table>之間。

    我不知道這一點,但我想你可以通過調用

    dbf.setIgnoringElementContentWhitespace(true); 
    

    the javadoc,關注,指出解析器必須在驗證模式比特消除節點。 ..

  • +0

    我要問如何通過定義一個通用的dtd或者是否有一些設置來忽略空格。讀取鏈接的doco,然後我需要將解析器置於「驗證」模式以使用此設置? – giulio 2011-04-06 08:46:01

    +0

    @Spepehen。一個快速測試帶來了一些probs。如果我激活setValidating(true),則會引發異常,因爲(可以理解)沒有列出任何模式。似乎忽略空白沒有踢沒有setValidating(true).. aarrrgghh !!! – giulio 2011-04-06 08:55:29

    +0

    發現這是對空白問題的迴應http://stackoverflow.com/questions/229310/how-to-ignore-whitespace-while-reading-a-file-to-produce-an-xml-dom – giulio 2011-04-06 08:59:53

    4

    正如您的輸出所示,這些是表和theader/tbody元素之間的空格。沒有DTD或模式,解析器不知道這些空格可以被忽略。您將不得不在分析器代碼中跳過這些節點。

    相關問題