DOM解析java將文本也視爲結點

 

如題,雖然我開始以爲我懂了,原來是不夠細心。
所謂“文本”包括回車、空格任何字符,不要忽略啊!
比較無奈是,DOM樹轉成xml文件時,不會自動換行、縮進,爲了格式美觀,用

TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT,"yes");

允許輸出DOM樹時添加空格。而正因此,解析xml文件時,就多出很多回車、空格組成的“文本結點”了,搞得我鬱悶了好半天,想原理也想不通,最後在CSDN發帖才解決的。

下面是原帖:

情況:
用DOM解析一XML文件,其中有用到XPath求值器
在解析中獲取結點時,出現這種情況:明明應該得到的是DOCUMENT_NODE類型的結點,但是得到的是TEXT_NODE

.xml文件結構:
<?xml version="1.0" encoding="GB2312"?>
  <category>
    <pattern>你是</pattern>
    <template>
      <random>
        <li>你猜看 </li> 
        <li>不告訴你 </li>
      </random>
    </template>
  </category> 

   
JAVA代碼:

Document document = getDocument();
Node rootNode = document.getFirstChild();

NodeList nodeCategorys = XPathAPI.selectNodeList(rootNode, "//category");
  for (int i = 0; i < nodeCategorys.getLength(); i++){
    if (nodeCategorys.item(i).hasChildNodes()){
          Node template =  XPathAPI.selectSingleNode(nodeCategorys.item(i), "template");

          //【1】這行如果寫成template.getFirstChild(),則templateChild就是TEXT_NODE類型
          Node templateChild = template.getFirstChild().getNextSibling();
           
                if (templateChild.getNodeName().equals("srai")) { continue; }
                if (templateChild.getNodeName().equals("random")){
                    ItemVo vo = new ItemVo();
                    Node patternNode = nodeCategorys.item(i).getFirstChild().getNextSibling();//這行問題同【1】

                    String pattern = patternNode.getFirstChild().getNodeValue();//【2】
                 
                    …… 
                    ……

                      NodeList nodeLi = XPathAPI.selectNodeList(templateChild,"li");
                      for (int j = 0; j < nodeLi.getLength(); j++)
                      {
                    Node liNode = nodeLi.item(j);//【3】這裏又不用加getNextSibling()了,取出的是DOCUMENT_NODE類型
                          String li = liNode.getFirstChild().getNodeValue();
                      }
                      ……
                      ……       

關於DOM將文本也視爲一個結點這個我知道,所以在【2】的地方用getFirstChild().getNodeValue()才取到 <patter>標籤的文本值。
但是【1】【3】兩處出現的問題我就很不理解了,爲什麼一會要加getNextSibling()一會又不加,而且感覺原理上不對啊? 

解答:
在DOM中,其實Template有三個直接子節點:
1。 文本節點(回車換行空格等, 在 <template> 和 <random>之間);
2。元素節點(random);
3。文本節點(回車換行空格在 </random>和 </template>之間),所以template.getFirstChild()返回的是文本節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章