黑马程序员技术交流社区
标题:
用DOM解析xml学习总结
[打印本页]
作者:
29198102shihao
时间:
2013-7-22 09:04
标题:
用DOM解析xml学习总结
DOM解析xml(将整个xml文档变成dom树放入内存,其实是将xml的元素节点,文本节点,属性节点全部转化为对象,并建立对象间的属性关系) ,缺点:太耗内存,只用小型的XML适用,但如果对于大型的XML就太耗费内存了,效率不高。优点:对xml节点crud操作方便
DOM有四个基本接口:1Document 2Node节点接口有子接口Elemet(元素节点)和Attr(属性节点) 3Nodelist 4NamedNodeMap
在java帮助文档内可以查到以上接口 question?不用引入包?org.w3c.dom包
注意:DOM有根节点document,不是根元素!
根节点Document和Element元素节点---节点!都有getElementsByTagName()的方法返回其元素子节点集合NodeList(只是子,不是孙),只是元素节点
元素节点里的文本也是节点类型!
子节点不光是元素节点还可以是文本节点,Element 的getChildNodes()获得所有子节点包括文本节点
所有Nodelist的item方法都返回Node类型,要强制转化为真实类型Elemet或Attr
如下xml文档
<people>
<person ID=”E1”>
<name>Tom</name>
<address>Tom</address>
<tel>Tom</tel>
<email>Tom</email>
</person>
</people>
解析:
1class DomTest{
main(){
1 DOM解析工厂
DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
2 DOM解析器
DocumentBuilder db=dbf.newDocumentBuilder();
3解析xml文档,获得根节点document
Document doc=db.parse(new File(xml路径));
//获取根节点下所有指定名字的子节点元素,返回NodeList
NodeList list=doc.getElementsByTagName(“person”);
for(int i=0;i<list.getLength();i++){
// NodeList的item方法返回一个Node类型,将其强制转化为元素节点Element
Element personElement=(Element)list.item(i);
//获取person节点下所有指定名字的子节点元素,返回NodeList
Element nameElement= personElement.getElementsByTagName(“name”);
//获取节点名
String name=nameElement .getTagName();
//接下来获取name节点下的文本,不能直接element2. getNodeValue(),因为文本节点也是个节点,要先获得文本节点,getFirstChild()得到第一个子节点
String content= nameElement.item(0).getFirstChild().getNodeValue();
}}
2 class DomTest2{
main(){
1DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
2 DocumentBuilder db=dbf.newDocumentBuilder();
3Document doc=db.parse(new File(xml路径));
//获取xml的编码
print(doc.getXmlEncoding()); 默认utf-8
print(doc.getXmlStandalone()); false??question
//获取根元素节点
Element root=doc.genDocumenElement();
//获取根元素所有子节点
NodeList list=root.getChildNodes();
for(i=0;i<list.getLength();i++){
print(list.item(i).getTagName());对于元素节点,打印出节点名,对于文本节点打印出#Text?question
for(i=0;i<list.getLength();i++){
Node node=list.item(i);
//返回节点类型是short整形是Node接口静态常量:ELEMENT_NODE ,TEXT_NODE COMMENT_NODE
print(node.getNodeType());
print(node.getNodeValue());获取文本节点的值!对元素节点返回null
}}}}
???question 空格 回车~~元素节,文本节点 注释节点空白符)
3元素属性操作:
123固定前三部
NodeList list=doc. getElementsByTagName(“Student”);
for(i=0;i<list.getLength();i++){
//Node的方法getAttributes返回元素节点的所有属性的map对象,NamedNodeMap是Node子类也有item方法
NamedNodeMap n=list.item(i).getAttributes();
//获取第一个属性,强制转换!
Attr attr=(Attr)n.item(0);
attr.getName(); 获取属性名
attr.getValue(); 获取属性值
}
4用DOM解析任意xml文档(树形结构递归)
class DomTest3{
main(){
123固定前三部
Element root=doc.getDocumentElement();
}
//递归解析xml的方法parseXML,递归解析每个节点
parseXML;明确的功能是:打印这个节点以及其下面的子节点的内容
static voic parseXML(Element element){
//获取元素节点,打印其内容
String s= element.getNodeName();
print(“<”+s);
//获取元素属性
NamedNodeMap n=element.getAttributes();
if(null!=n){
for(i=0;i<n.getLength();i++){
Attr attr=(Attr)n.item(i);
String attrName=attr.getName();
String attrValue=attr.getValue();
print(“”+attrName+”=”+” \” ”+attrValue+” \” ”+“>”);
//子元素处理,如果是元素节点递归调用方法,如果是文本节点打印,如果是注释节点
NodeList list= element.getChildNodes();
for(i=0;i<list.getLength();i++){
Node n=list.item(i);
short nodeType=n.getNodeType();
if(nodeType==Node. ELEMENT_NODE){
parseXML((Element n));
else if(nodeType==Node. TEXT_NODE){
print(n.getNodeValue());
else if(nodeType==Node.COMMENT_NODE){
print(“<!--”);
Comment c=(Comment)n;
print(c.getData());
print(“-->”);
}}
//打印完所有子节点后,关闭该标签
print(“</”s+ “>”);
}}}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2