日期:2014-05-20  浏览次数:20771 次

关于XML菜鸟问题
XML code

<?xml version="1.0" encoding="UTF-8" ?>
<书架>
    <书>
        <书名>魔兽世界法师攻略</书名>
        <作者>皮卡丘</作者>
        <售价>100.00</售价>
    </书>
    <书>
        <书名>魔兽世界萨满攻略</书名>
        <作者>杰尼龟</作者>
        <售价>100.00</售价>
    </书>
</书架>



Java code

package com.wow.test1;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Test {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder =factory.newDocumentBuilder();
        Document document =builder.parse("src\\book.xml");
        NodeList list=document.getElementsByTagName("书");
        System.out.println(list.item(0).getTextContent());
        System.out.println(list.item(0).getFirstChild().getNodeValue());
    }
}




小弟想问的是list.item(0).getTextContent()和list.item(0).getFirstChild().getNodeValue()的区别是什么?
为什么getElementsByTagName("书");的时候list.item(0).getFirstChild().getNodeValue()没有打印的内容?

------解决方案--------------------
情况有点复杂,跟XML规范有关。

XML中,只有 属性、备注、文本,这几种节点才有nodeValue。

而文本,不是你理解的:
“<书名>魔兽世界法师攻略</书名>”
这个东西,而是<书名>这个节点之内还有一个文本节点是:
“魔兽世界法师攻略” 

比如有节点为:
<书名>魔兽世界<强调>法师</强调>攻略</书名>
那么书名下面有三个字节点,分别为:
文本节点:魔兽世界
元素节点:<强调>
文本节点:攻略


说了半天不知道你明白了没有,总的来说应该是:
System.out.println(list.item(0).getFirstChild().getFirstChild().getNodeValue());
或者:
System.out.println(list.item(0).getFirstChild().getTextContent());
------解决方案--------------------
探讨

我运行为啥没问题?

Java code

ByteArrayInputStream bais = new ByteArrayInputStream("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<书架><书><书名>魔兽世界法师攻略</书名><作者>皮卡丘</作者><售价>100.00</售价></书><书><书名>魔兽世界萨满……