解析文件节点以及子节点的值
1.先获取子节点,Node下有方法getChildNodes()来获取某个节点的子节点的集合,返回NodeList类型.
NodeList childNodes=book.getChildNodes()//包含book节点所有的子节点,两个标签之间的所有内容都看成是子节点.
2.通过childNodes的getLength()方法返回字点的个数(空格与换行字符看成为一个文本节点,标签与结束标签看成一个元素节点)
3.通过NodeList的item(i)获取指定位置子节点的名称返回Node类型.再用Node类型的getNodeName()方法就可以获取节点名
Node childnode=childNodes.item(i);
String name=childnode.getNodeName();
可以通过Node类的getNodeType()来区分文本类型的node以及元素类型的node,看当前Node类型是否与Node."节点类型英文全称"相同.
if(childnode.getNodeType==Node.ELEMENT_NODE)
{System.out.println(name)}
4.不能直接通过Node的getNodeValue()来获取节点的值,因为元素节点的nodeValue的返回值为null而且标签之间的文本被看做是该标签的子节点.所以要用Node的getFirstChild()此时获取的子节点为文本节点,Text节点类型的nodeValue返回值为节点内容,再getNodeValue()。
或者直接用Node的getTextContent()方法直接获取节点值。
如果该Node节点还存在其他子节点并且有节点值<name><a>广州大学</a>华软学院</name>,那么用getFirstChild().getNodeValue()一样是null,因为获取的子节点仍然是element类型的
如果用Node的getTextContent(),一样会把<a>元素节点当成是Content输出。
node 节点有三种,
element表示当前标签元素
attr表示当前节点的属性值
text 表示文本节点
去除text节点的一个办法是
调用Node类型的getChildNodes()方法获取节点下的子节点集合,返回NodeList类型
调用每个节点的getNodeName()获取节点名称
XML中换行符作为Text子节点,返回#text
为了获取ELement节点,需要指定节点类型
获取子节点的值时,需要先getFirstChild()获取子节点,再使用getNodeValue()获取节点值,如果直接调用getNodeValue(),会返回null。
getTextContent() 获取节点里所有内容的值,作为字符串输出。
获取节点内的text内容,可以先获取该Text节点,然后getNodeValue();
或者使用getTextContent() ---返回该节点下的所有text内容(不包含标签)
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class bookparse {
public static void main(String[] args) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse("src/lib/book.xml");
NodeList booklist = document.getElementsByTagName("book");
for (int i = 0; i < booklist.getLength(); i++) {
Node node = booklist.item(i);
NamedNodeMap nnms = node.getAttributes();
System.out.println("第" + (i + 1) + "本书:");
for (int j = 0; j < nnms.getLength(); j++) {
NodeList bookchild = node.getChildNodes();
for (int k = 0; k < bookchild.getLength(); k++) {
Node bookvalue = bookchild.item(k);
if (bookvalue.getNodeType() == Node.ELEMENT_NODE) {
System.out.print(bookvalue.getNodeName() + ":");
System.out.println(bookvalue.getTextContent());
}
}
}
System.out.println("");
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
item(k).getNodeValue() 拿不到内容值, 因为不是同一个类型。 必须用item(k).getFirstchild().getNodeValue()
element类型节点getnodevalue为null
空白和换行符也作为子节点
nodeValue的返回值类型为null;
getFirstChild().getNodeValue方法和getTextContent()方法的区别
使用getFirstChild方法,获取子节点再获取子节点的值
//获取book下的子节点
NodeList childnode=book.getChildNodes();
for(int i=0;i<childnode.getLength();i++){
childnode.item(i).getNodeType();//获取节点类型,以便于筛选节点
childnode.item(i).getNodeName();//获取节点名称
//获取节点的节点值
childnode.item(i).getFirstChild.getNodeValue();//节点内的值是本节点的子节点,要获取子节点后再获取节点值,否则返回的值为null。当本届点有不只一个子节点时,返回的值也为null。
childnode.item(i).getTextContent();//可直接获取book子节点的节点值。当此节点有不止一个子节点时,获取的是所有子节点的节点值。
}
getChildNodes()获取节点的子节点集合,空白和换行符也被当成了子节点
Text类型的节点,nodeName返回值#text
getNodeType()用来判断节点类型
elementValue的值都是null,应该用getFirstChild().getNodeVaule()来获取,因为尖括号中间的值被认为是节点,或者getTextContent()方法
空白和换行符也算作子节点
#text:由空格和换行符组成的Text类型节点的节点名称
DOM解析XML文件的节点名和结点值:
获取book节点的子节点:NodeList childNodes=book.getChildNodes();
获取节点名:childNodes.item(k).getNodeName();
获取结点值:childNodes.item(k).getFirstChild().getNodeValue();(该节点不包含子节点)
childNodes.item(k).getTextContent();
DOM解析XML文件的节点名与节点值
//解析book节点的子节点 NodeList childNodes = book.getChildNodes(); //遍历childNodes获取每个节点的节点名和节点值 System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点"); for(int k=0;k<childNodes.getLength();k++){ //区分出text类型的node以及element类型的node if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){ //获取element类型节点的节点名 System.out.print("第"+(k+1)+"个节点的节点名:"+childNodes.item(k).getNodeName()); //获取element类型节点的节点值 //getFirstChild().getNodeValue()方法把第一个子节点的节点值输出 //System.out.println("--节点值是"+childNodes.item(k).getFirstChild().getNodeValue()); //getTextContent()方法把element类型的node中的文本全部输出 System.out.println("--节点值:"+childNodes.item(k).getTextContent()); } }
常用的节点类型
解析文件节点以及子节点的值
1.先获取子节点,Node下有方法getChildNodes()来获取某个节点的子节点的集合,返回NodeList类型.
NodeList childNodes=book.getChildNodes()//包含book节点所有的子节点,两个标签之间的所有内容都看成是子节点.
2.通过childNodes的getLength()方法返回字点的个数(空格与换行字符看成为一个文本节点,标签与结束标签看成一个元素节点)
3.通过NodeList的item(i)获取指定位置子节点的名称返回Node类型.再用Node类型的getNodeName()方法就可以获取节点名
Node childnode=childNodes.item(i);
String name=childnode.getNodeName();
可以通过Node类的getNodeType()来区分文本类型的node以及元素类型的node,看当前Node类型是否与Node."节点类型英文全称"相同.
if(childnode.getNodeType==Node.ELEMENT_NODE)
{System.out.println(name)}
4.不能直接通过Node的getNodeValue()来获取节点的值,因为元素节点的nodeValue的返回值为null而且标签之间的文本被看做是该标签的子节点.所以要用Node的getFirstChild()此时获取的子节点为文本节点,Text节点类型的nodeValue返回值为节点内容,再getNodeValue()。
或者直接用Node的getTextContent()方法直接获取节点值。
如果该Node节点还存在其他子节点并且有节点值<name><a>呵呵呵</a>华以及咯</name>,那么用getFirstChild().getNodeValue()一样是null,因为获取的子节点仍然是element类型的
如果用Node的getTextContent(),一样会把<a>元素节点当成是Content输出。 结果为呵呵呵华以及咯。
document.getElementByTagName(),获取标签集合<br>
2.node.getAttribute(),获取属性集合(应该是一个Map集合)<br>
3.NodeList集合(标签集合) NameNodeMap集合(属性集合)<br>
1.获取book节点的子节点。NodeList childNodes =book.getChildNodes();<br>
2.获取book下子节点的节点内容的两种方式:<br>
1)childNodes.item(index).getFirstChild().getNodeValue();<br>
2)childNodes.item(index).getTextContent();<br>
第一种方式在其下面还有子节点时,会因为是Element节点所以默认的getNodeValue()返回值是null;<br>
第二章方式在其下面还有子节点时,会将子节点内容与当前节点内容一起获取。
注:在获取当前节点的子节点时,当前节点下的空格与回车符会被当做Text类型的子节点获取(#Test)。