Java中如何解析XML文件
Java中如何解析XML文件
xml文件:"student.xml"
xml 代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE zmclass SYSTEM "student.dtd">
<zmclass id="0703">
<student sex="男">
<name>MICHAEL</name>
<age>24</age>
<address>武汉</address>
</student>
<student sex="女">
<name>王黎</name>
<age>24</age>
<address>武汉</address>
</student>
<student sex="男">
<name>莫智洲</name>
<age>24</age>
<address>武汉</address>
</student>
<student sex="男">
<name>曹锋</name>
<age>23</age>
<address>武汉</address>
</student>
</zmclass>
dtd文件:"student.dtd"
python 代码
<!--
ELEMENT 元素
ATTLIST 属性
元素出现的次数:
*: 从“0”到“N”。
+: 大于等于“1”
?: 是“0”或者是“1”。
默认: 只可能是“1”。
常用属性类型:
CDATA:一般的文字。
ID:该属性在XML文件中是唯一的,常用来表示身份证。
ETC......
#REQUIRED 大写
#required 小写
表示在标记中必须出现此属性。
#IMPLIED 大写
#implied 小写
表示在标记中可以不出现的属性。
#FIX 大写
#fix 小写
表示在标记中是某个固定的值。
-->
<!ELEMENT zmclass (student+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST zmclass id CDATA #REQUIRED>
<!--建立“父子”关系-->
<!ELEMENT zmclass (name,address,age)>
<!ATTLIST student sex (男|女) #REQUIRED>
java文件:"DomTest.java"
package test;
/**
*
* @描述:解析XML文件的测试类。
*/
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DomTest {
public static void main(String[] args){
List stuArrList = new ArrayList();//创建用来保存学生信息的集合。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("student.xml"));
Element root = doc.getDocumentElement();//得到文档对象树。
//System.out.println(root);
System.out.println("根元素名称:"+root.getTagName());
NodeList stuList = root.getElementsByTagName("student");
//开始逐个创建学生对象。
for(int i = 0; i < stuList.getLength();i++){
Student s = new Student();
Element stuE = (Element)stuList.item(i);
//System.out.println(stuE);
s.setSex(stuE.getAttribute("sex"));//向学生对象中写入性别属性。
NodeList stuInfoList = stuE.getChildNodes();
for(int j = 0;j < stuInfoList.getLength();j++){
Node temp = stuInfoList.item(j);
if(temp.getNodeType()==Node.ELEMENT_NODE){//判断对象的类型的节点是不是元素。
Element tempE = (Element)temp;//转换类型到元素。
Node initW = tempE.getLastChild();
//Node initW = tempE.getFirstChild();
//由于只有一个节点,第一和最后一个都是同一个。
if("name".equals(tempE.getNodeName())){
s.setName(initW.getNodeValue());//加入姓名。
}if("age".equals(tempE.getNodeName())){
s.setAge((Integer.parseInt(initW.getNodeValue())));//加入年龄。
}if("address".equals(tempE.getNodeName())){
s.setAddress((initW.getNodeValue()));//加入地址。
}
}
}
stuArrList.add(s);//添加进集合中。
}
Iterator ite = stuArrList.iterator();//使用跌代器遍历集合元素。
while(ite.hasNext()){
Student s = (Student)ite.next();
System.out.println(s);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
java 代码
java文件:"Student.java"
java 代码
package test;
/**
*
* @描述:学生类用来保存学生的信息。
*/
public class Student {
private String name;
private String sex;
private int age;
private String address;
public String toString(){//覆盖该方法。
return name+"-"+sex+"-"+age+"-"+address;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
运行结果:
ruby 代码
根元素名称:zmclass
MICHAEL-男-24-武汉
王黎-女-24-武汉
莫智洲-男-24-武汉
曹锋-男-23-武汉