java就是来做工具的一门语言,故解析XML文档就是一步很重要的操作,以前写的解析都是将路径写死,一般改文件时要改动大量代码,代价很大故就有了下面的代码,可以随意改换路经,写在这以防自己以后用起来方便。
首先得初始化DocumentBuildFactory对象
private static DocumentBuilder db;
private static void init() {
try {
db = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} }
再者就是读取路径,再初始化等,下面这段代码是先将Book类型取出来存到NodeList类里面再一一遍历,最后再处理Book类里的属性,此时将它写成一个抽象方法的好处是可以随时调用增强代码的简洁性。再将Book下的property属性取出来存到NodeList类里面再一一遍历,再调用抽象方法,进行处理
public XMLReader xmlParse(Document document, String tagname) {
NodeList nodeList = document.getElementsByTagName(tagname);
for(int index = 0; index < nodeList.getLength(); index++) {
Element element = (Element) nodeList.item(index);
dealElement(element, index);
}
return this;
}
public XMLReader xmlParse(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
for(int index = 0; index < nodeList.getLength(); index++) {
Element ele = (Element) nodeList.item(index);
dealElement(ele, index); }
return this; }
}
完整代码如下:
XML文件:记得格式应该为utf-8,不然文字就是乱码
<?xml version="1.0" encoding="UTF-8"?>
<javaClass>
<Book book="书的类型" table="童话">
<property name="安徒生" column="1111"></property>
<property name="灰姑娘" column="2222"></property>
</Book>
<Book book="书的类型" table="名著">
<property name="偷影子的人" column="8888"></property>
<property name="追风筝的人" column="9999"></property>
<property name="解忧杂货铺" column="6666"></property>
<property name="冰与火的时代" column="7777"></property>
</Book>
</javaClass>
读取类为:
package XML;
import java.io.IOException;
import java.io.InputStream;
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.NodeList;
import org.xml.sax.SAXException;
public abstract class XMLReader {
private static DocumentBuilder db;
private static void init() {
try {
db = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} }
public XMLReader() {
}
public static Document document(String xmlPath) {
return document(XMLReader.class.getResourceAsStream(xmlPath)); }
public static Document document(InputStream is) {
init();
Document doc = null;
try {
doc = db.parse(is);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return doc;
}
public abstract void dealElement(Element element, int index);
public XMLReader xmlParse(Document document, String tagname) {
NodeList nodeList = document.getElementsByTagName(tagname);
for(int index = 0; index < nodeList.getLength(); index++) {
Element element = (Element) nodeList.item(index);
dealElement(element, index);
}
return this;
}
public XMLReader xmlParse(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
for(int index = 0; index < nodeList.getLength(); index++) {
Element ele = (Element) nodeList.item(index);
dealElement(ele, index); }
return this; }
}
测试类如下:
package XML;
import org.w3c.dom.Element;
public class Test {
public static void main(String[] args) {
new XMLReader() {
@Override
public void dealElement(Element element, int index) {
String classs = element.getAttribute("book");
String table = element.getAttribute("table");
System.out.println("\n"+classs+"-》"+table);
new XMLReader(){
public void dealElement(Element element, int index) {
String type = element.getAttribute("name");
String column = element.getAttribute("column");
System.out.println(type+"-"+column);
}
}.xmlParse(element, "property");
}
}.xmlParse(XMLReader.document("NewFile1.xml"), "Book");
}
}
运行结果:
书的类型-》童话
安徒生-1111
灰姑娘-2222
书的类型-》名著
偷影子的人-8888
追风筝的人-9999
解忧杂货铺-6666
冰与火的时代-7777