1.xml的格式(将xml拖入到项目中了)
<?xml version="1.0" encoding="UTF-8"?>
<class>
<student id="1">
<name>张三</name>
<age>23</age>
<sex>男</sex>
<grade>90</grade>
</student>
<student id="2">
<name>李四</name>
<age>24</age>
<sex>女</sex>
<grade>95</grade>
</student>
</class>
2.DOM方式解析xml
第一步:创建一个DocumentBuilderFactory对象(这是一个工厂类,用它的newInstance方法创建对象)
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
第二步:通过dbf实例的newDocumentBuilder方法创建一个DocumentBuilder对象(此处需捕获异常)
DocumentBuilder db=dbf.newDocumentBuilder();
第三步:通过db实例的parse方法创建一个Document对象(参数有很多种类型,这里取它的相对路径,填绝对路径也可以)
Document document=db.parse("students.xml");
第四步:通过document实例的getElementsByTagName方法获得一个NodeList对象(这里说一下,导入的包应该是org.w3c.dom,上下文中也是如此,方法的参数为标签名,如class,student)
NodeList nodelist=document.getElementsByTagName("student");
可能有人会问,如果我们完全不知道xml的标签名了,这个我也不太清楚,DOM方式解析xml这里只探讨知道标签名的情况。
第五步:获得nodelist里面所有该标签的属性,即id。
分2中情况,第一种:不知道student有什么属性,那么需要遍历nodelist,并通过nodelist的item方法得到每一个Node对象。
再通过node实例的getAttributes获得NamedNodeMap对象,即所有Student属性的集合。然后再遍历attrs实例。通过attrs实例的item方法再得到每一个Node对象。这个对象对应的是student单个的属性与属性值。最后通过attr实例的getNodeName与getNodeValue方法获得属性名与属性值
for(int i=0;i<nodelist.getLength();i++)
{
Node node=nodelist.item(i);
NamedNodeMap attrs=node.getAttributes();
for(int j=0;j<attrs.getLength();j++)
{
Node attr=attrs.item(j);
System.out.print("属性名:"+attr.getNodeName());
System.out.println("属性值:"+attr.getNodeValue());
}
}
第二种情况:知道student属性名。通过nodelist的item方法得到每一个Node对象并强制转换为Element对象,然后再通过element实例的getAttribute方法获得属性值,参数为
属性名。
for(int i=0;i<nodelist.getLength();i++)
{
Element element=(Element)nodelist.item(i);
System.out.println("id的属性值为"+element.getAttribute("id"));
}
第六步 :获取student所有子节点的节点名与节点值
首先还是遍历nodelist对象,并通过nodelist的item方法获得每一个Node对象,通过node实例的getChildNodes获得一个NodeList对象,该对象是student所有节点的集合
然后遍历这个childnodes实例,再通过这个childnodes实例的item方法得到每个node对象,通过node对象的getNodeName与getTextContent方法分别获得节点名与
节点值。
for(int j=0;j<childnodes.getLength();j++)
{
if(childnodes.item(j).getNodeType()==Node.ELEMENT_NODE)
{
System.out.println(childnodes.item(j).getNodeName());
System.out.println(childnodes.item(j).getTextContent());
}
}
这里有2点必须注意,一是通过getNodeType方法排除空格,因为在xml中,java认为空格也是一个子节点
而是 不能getNodeValue去获取节点的值。这是为什么了,用一张图说明,因为节点也是有类型的。上述说到的空格节点就是test类型的节点。
简单点说,就是student是元素节点,id是属性节点,张三是文本节点,这样就很好理解了。
节点类型 NodeType Named Constant nodename nodevalue
Element 1 ELEMENT_NODE element name null
Attr 2 ATTRIBUTE_NODE 属性名称 属性值
Text 3 TEXT_NODE #text 节点内容