解析方式:
- DOM解析
直接性把XML文档全部读取到内存中来,会得到一个Document对象,然后对其访问操作,DOM方式W3C推荐的一种方式
(好处:增删改查方便) - SAX解析
Simple API for XML,不是官方的标准,但他是XML领域事实上的标准
SAX是边读取XML文档,边解析
- DOM解析
XML的解析器
- Crimson(SUN)
- Xerces(IBM -> Apache)
- Aelfred(JDOM, DOM4J)
- 第三方解析工具 JDOM,DOM4J(常用)
Java里面对XML的解析工具JAXP
JAXP方式解析XML步骤:
//获取 DocumentBuilderFactory 实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//加载要解析的XML文档,获取Document对象
Document doc = db.parse(new FileInputStream("xmlfile/students.xml"));
//对Document对象进行操作
//动态生成xml文档,并写入文件
//获取DocumentBuilderFactory实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInsatence();
//通过Factory获取DocumentBuilder解析器对象实例
DocumentBuilder db = dbf.newDocumentBuilder();
//创建一个新的Document对象
Document doc = db.newDocument();
//添加一系列的元素
Element rootElt = doc.createElement("班级");
Element studentElt1 = doc.createElement("学生");
Element studentElt1 = doc.createElement("姓名");
studentElt1_name.setTextContent("张曼玉");
studentElt1_name.setAttribute("别名","玉姐");
Element studentElt1_sex = doc.createElement("姓名");
studentElt1_sex.setTextContent("女");
studentElt1.appendChild(studentElt1_name);
studentElt1.appendChild(studentElt1_sex);
Element studentElt2 = doc.createElement("学生");
Element studentElt2_name = doc.createElement("姓名");
studentElt2_name.setTextContent("林青霞");
studentElt2_name.setAtribute("别名","霞妹");
Element studentElt2_sex = doc.createElement("性别");
studentElt2_sex.setTextContent("女");
studentElt1.appendChild(studentElt1_name);
studentElt1.appendChild(studentElt1_sex);
rootElt.appendChild(studentElt1);
rootElt.appendChild(studentElt2);
doc.appendChild(rootElt);
//获取TransfomerFactory实例
TransformerFatory tff = TransformerFactory.newInstance();
//通过TransfomerFactory创建Transformer实例
Transformer tf = tff.newTransformer();
//通过Document生成DOMSource实例
DOMSource sourse = new DOMSource(doc);
//创建写DOM文档的输出流
StreamResult xmlResult = new StreamResult(new FileOutputStream("test.xml"));
//通过Transfomer的transform方法把DOMSource对象写入输出流
tf.transform(source,xmlResult);
- JAXP方式解析XML步骤(SAX方式)
SAX解析XML步骤
SAXPerserFactory spf = ASXPerserFactory.newInstance();
ASXParser sp = spf.newSAXParser();
sp.parse("test.xml",new MyHandler() );
- SAX主要用于对XML文档解析,不能去修改、删除、添加元素
SAX是推行机制,把发现的内容告诉程序员(函数),程序员可以自己下决定如何处理
MyHandler接口:
DefaultHandler SAX事件:
- startDoucment()
发现文档的开始,解析器开始扫描文件 - endDocument()
发现了文档尾 - startElement()
发现了一个起始标签,返回元素名,以及所有属性名和值 - character()
发现了一些文本,将得到一个字符数组,该字符数组的偏移量和长度变量,由这三个变量可以得到解析器发现的文本 - endElement()
发现一个结束标签,并返回元素名称
- startDoucment()
DOM4J解析XML
被解析的XML:
<?xml version="1.0" encoding="UTF-8"?>
<学生们>
<学生>
<学号>04142122</学号>
<姓名>张三</姓名>
</学生>
<学生>
<学号>04142138</学号>
<姓名>李四</姓名>
</学生>
<学生>
<学号>04156700</学号>
<姓名>王五</姓名>
</学生>
<学生 学号="04149441" 姓名="马六" />
</学生们>
JAVA代码(引入dom4j-1.6.1包):
public class TestDOM4JParseXML {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
FileInputStream fis = null;
try {
fis = new FileInputStream("XMLDemo02.xml");
Document doc = reader.read(fis);
//获取根元素
Element rootElt = doc.getRootElement();
System.out.println(rootElt.getName());
List elements = rootElt.elements();
System.out.println(elements.size());
for(int i=0 ; i<elements.size();i++){
Element elt = (Element)elements.get(i);
System.out.println(elt.getName());
List attrList = elt.attributes();
for(int j=0 ; j<attrList.size() ; j++){
Attribute attr = (Attribute) attrList.get(j);
System.out.println("\t属性" + attr.getName() + " = " + attr.getValue());
}
List subEltList = elt.elements();
for(int j=0 ; j<subEltList.size(); ++j){
Element subElt = (Element) subEltList.get(j);
System.out.println("\t子元素" + subElt.getName() + " : " + subElt.getText());
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(fis != null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
结果:
学生们
4
学生
子元素学号 : 04142122
子元素姓名 : 张三
学生
子元素学号 : 04142138
子元素姓名 : 李四
学生
子元素学号 : 04156700
子元素姓名 : 王五
学生
属性学号 = 04149441
属性姓名 = 马六
递归解析XML
待解析xml
<?xml version="1.0" encoding="UTF-8"?>
<stuents id="123">
<student>
<name length="12">张三</name>
</student>
<student>
<name length="12">李四</name>
</student>
</stuents>
java代码:
public class TestDOM4JParseXML {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
FileInputStream fis = null;
try {
fis = new FileInputStream("XMLDemo01.xml");
Document doc = reader.read(fis);
Element rootElt = doc.getRootElement();
printElementDetail(rootElt,"");
} catch (FileNotFoundException | DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void printElementDetail(Element elt,String str){
System.out.print(str + elt.getName());
List<Attribute> attrList = elt.attributes();
int attrCount = attrList.size();
if(attrList.size() != 0){
System.out.print("[");
for(int i=0 ; i<attrList.size() ; ++i){
Attribute attr = attrList.get(i);
System.out.print(attr.getName()+" = "+attr.getValue());
if(i < attrCount - 1){
System.out.print(", ");
}
}
System.out.print("]");
}
String text = elt.getText().trim();
if(!"".equals(text)){
System.out.print(": "+text);
}
System.out.println();
List<Element> eltList = elt.elements();
for(int i=0 ;i<eltList.size() ; ++i){
Element subElt = eltList.get(i);
printElementDetail(subElt,str + "\t");
}
}
}
结果:
stuents[id = 123]
student
name[length = 12]: 张三
student
name[length = 12]: 李四
生成XML
public class DOM4JCreateXML {
/**
* 目标XML:
* <select name="city">
* <option value="1">北京市</option>
* <option value="2">天津市</option>
* <option value="3">上海市</option>
* <option value="4">重庆市</option>
* </select>
*/
public static void main(String[] args) {
//创建Document
Document doc = DocumentHelper.createDocument();
Element rootElt = doc.addElement("select");
rootElt.addAttribute("name", "city");
Element cityElt1 = rootElt.addElement("option");
cityElt1.addAttribute("value", "1");
cityElt1.addText("北京市");
Element cityElt2 = rootElt.addElement("option");
cityElt2.addAttribute("value", "2");
cityElt2.addText("天津市");
Element cityElt3 = rootElt.addElement("option");
cityElt3.addAttribute("value", "3");
cityElt3.addText("上海市");
Element cityElt4 = rootElt.addElement("option");
cityElt4.addAttribute("value", "4");
cityElt4.addText("重庆市");
XMLWriter writer = null;
FileWriter fw = null;
try {
fw = new FileWriter("city.xml");
//doc.write(fw);难以控制格式
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(fw,format);
writer.write(doc);
System.out.println("写入成功!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(fw!=null){
fw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}