对于这样一个xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student id="00001" name="张三" sex="男" birthday="2000-10-3">
<hobby>学习</hobby>
<hobby>敲代码</hobby>
<introduce>
初中生
</introduce>
</student>
<student id="00002" name="李四" sex="女" birthday="2001-10-21">
<hobby>看书</hobby>
<hobby>画画</hobby>
<introduce>
高中生
</introduce>
</student>
</students>
首先
InputStream is = Class.class.getResourceAsStream("/stu/aboutxml/student.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(is);
得到这个doc,我们可以理解为我们讲xml文件转换成了一个doc,可以被java认识的doc“文档”
NodeList nodeStudentlist = doc.getElementsByTagName("student");
for (int i = 0; i < nodeStudentlist.getLength(); i++) {
Element eleStudent = (Element) nodeStudentlist.item(i);
String id = eleStudent.getAttribute("id");
String sex = eleStudent.getAttribute("sex");
接下来我们对这个doc进行操作可以得到最大的标签集合即student标签集合
,遍历这个集合,我们可以得到每个student的属性信息,通过getAttribute得到每一个属性。每一个student标签下还有许多子标签,接下来对每一个student进行操作,就可得到其下的子标签
Element introduce = (Element) eleStudent.getElementsByTagName("introduce").item(0);
NodeList hobbies = eleStudent.getElementsByTagName("hobby");
for (int j = 0; j < hobbies.getLength(); j++) {
String hobby = hobbies.item(j).getTextContent();
}
对于introduce,我们只写了一对标签框,就只用一个Element接受introduce。而对于hobby有多个,则用一个Nodelist接收这个hobby集合,遍历这个集合,得到每一个hobby。
便解析了整个xml文件
接下来,我们将做一个解析工具。
思想是
第一步 我们根据path得到的这个doc“文档”,可以做成一个方法。
第二部 根据这个文档,解析最大的标签集合 做成一个方法。
第三步 根据这个集合中的每一个集合,解析其下的子标签。
其中,第二步是在第一步的基础下完成,因为要解析最大的标签集合,我们需要这个doc“文档” 和 标签名
第三步是在第二部的基础下完成,是需要大标签才能解析出来子标签。
对于解析出来的标签的处理,我们采用抽象方法,由调用者处理
public abstract class XMLParse {
private static DocumentBuilderFactory dbf;
private static DocumentBuilder db;
static {
dbf = DocumentBuilderFactory.newInstance();
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
public XMLParse() {
}
public static Document getDocument(String path) throws Exception {
InputStream is = Class.class.getResourceAsStream(path);
if (is == null) {
throw new Exception("parse path is invalid");
}
return db.parse(is);
}
public abstract void dealElement(Element element,int index);
public void parseTag(Document document, String tag) {
NodeList list = document.getElementsByTagName(tag);
for (int index = 0; index < list.getLength(); index++) {
Element element = (Element) list.item(index);
dealElement(element,index);
}
}
public void parseTag(Element element,String tag) {
NodeList list = element.getElementsByTagName(tag);
for (int index = 0; index < list.getLength(); index++) {
Element ele = (Element) list.item(index);
dealElement(ele,index);
}
}
由此便得到了这个xmlParser。
我们用这个工具在解析一下xml文件
List<StudentInfo> studentList = new ArrayList<>();
//准备的list用于存放解析出来的信息
new XMLParse() {
@Override
public void dealElement(Element element, int index) {
StudentInfo student = new StudentInfo();
student.setId(element.getAttribute("id"));
student.setName(element.getAttribute("name"));
student.setSex(element.getAttribute("sex"));
studentList.add(student);
} }.parseTag(XMLParse.getDocument("/stu/aboutxml/student.xml"),"student");
for (StudentInfo stu: studentList) {
System.out.println(stu.toString());
}
new一个parser 首先得完成抽象方法。再对这个parser调用parseTag方法,传入这个doc“文档”,和标签名得到student集合。再在这个parser内部再new一个parser去处理每一个student下的introduce和hobby。
List<StudentInfo> studentList = new ArrayList<>();
new XMLParse() {
@Override
public void dealElement(Element element, int index) {
StudentInfo student = new StudentInfo();
student.setId(element.getAttribute("id"));
student.setName(element.getAttribute("name"));
student.setSex(element.getAttribute("sex"));
new XMLParse() {
@Override
public void dealElement(Element element, int index) {
String introduce = element.getTextContent().trim();
student.setIntroduce(introduce);
}
}.parseTag(element,"introduce");
new XMLParse() {
@Override
public void dealElement(Element element, int index) {
String hobby = element.getTextContent();
student.addHobby(hobby);
}
}.parseTag(element,"hobby");
studentList.add(student);
}
}.parseTag(XMLParse.getDocument("/stu/aboutxml/student.xml"),"student");
for (StudentInfo stu: studentList) {
System.out.println(stu.toString());
}