三、XML解析技术
1、 js、java、c、c++等这些语言需要对xml文件进行crud操作?
1) xml作为数据传递,需要解析
2) xml作为配置文件,需要读取
3) xml作为小型数据库,crud操作;
备注:这些语言对xml文件操作的时候有一套规范;w3c组织为了大家操作xml方便,就定义了一套规范(api/函数)
2、XML解析器以及各自优缺点:
dom解析器、sax解析器、dom4j
dom (Document Object Mode 即文档对象模型):是W3C组织推荐的定义的访问和处理XML文档的标准方式;
sax(Simple API for XML):不是官方标准,但是他是XML社区事实上的标准,几乎所有的XML解析器都支持它;
备注:xml解析器实际上就是一套API(Application Program Interface)
1) 在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构建代表整个DOM树的Document对象,从而再对XML进行操作。
在此情况下,如果xMl文档特别大,就会消耗计算机大量的内存,严重情况下可能还会导致内存溢出。
2)sax技术可以在不加载xml文件全部时,就可以解析xml文档。sax技术里面两个重要的对象:sax解析器;事件处理器(继承DefaultHandle类)。sax是一种推式的机制,你创建一个sax解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你),如何处理这些内容由程序员自己决定。sax技术缺陷是:它不能对我们的xml文件进行修改、添加、删除,这也是他的缺点,也是说只能使用sax技术进行解析和读取,
在sax的程序中,五个最常用的sax事件
startDocument()--->告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
endDocument()--->告诉你解析器发现了文档尾
startElement()--->告诉你解析器发现了一个开始标签,该事件告诉你元素的名称,该元素的所有的属性名和值
character()--->告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度变量,有三个变量你可以得到解析器发现的文本
endElement()--->告诉你解析器发现了一个结束标签,该事件告诉你元素的名称
3)为什么有dom4j?
dom缺点:比较耗费内存;sax缺点:只能对xml进行读取,但是不能去修改、添加、删除
dom4j:即可以提高效率,同时也可以进行crud。特别说明:因为dom4j不是sun公司的产品,所以我们开发dom4j需要引入jar 包
|DOM解析技术实例|
Class.xml文件内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><班级>
<学生 sex="女" 学号="01">
<名字>宋江</名字>
<年龄>29</年龄>
<爱好>打球</爱好>
</学生>
<学生 sex="男=女" 学号="02">
<名字>丹丹</名字>
<年龄>27</年龄>
<爱好>睡觉</爱好>
</学生>
<学生 sex="女" 学号="03">
<名字 类型="花心">五花</名字>
<年龄>30</年龄>
<爱好>睡觉</爱好>
</学生>
</班级>
DomXml1.java 文件中内容
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.soap.Node;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DomXml1 {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
//创建DOM解析器工厂对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//创建DOM解析器对象
DocumentBuilder dBuilder=dbf.newDocumentBuilder();
//调用DOM解析器对象的parse()方法解析Xml文档,得到代表整个文档的
Document document= dBuilder.parse("src/XML用法/Classes.xml");
//执行完上述的代码就会把内存中的document拿到,那么document下面的任何一个元素或者说是任何一个节点都会被拿到
read(document);
/* add(document);
update(document);
del_ele(document);*/
del_att(document);
}
//读取节点、属性
public static void read(Document doc){
NodeList nodeList= doc.getElementsByTagName("学生");
System.out.println("学生的信息的个数是"+nodeList.getLength());
//取出 第一个学生
Element stu= (Element) nodeList.item(0);
System.out.println("第一个学生的性别是"+stu.getAttribute("sex"));
Element name=(Element) doc.getElementsByTagName("名字").item(0);
System.out.println("第一个学生的名字是"+name.getTextContent());
}
//遍历节点
public static void list(Node node){
if(node.getNodeType()==node.ELEMENT_NODE){
System.out.println(node.getNodeName());
}
//取出node的子节点
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//再去显示
Node n=(Node) nodeList.item(0);
list(n);
}
}
//增加节点、属性
public static void add(Document doc) throws TransformerException{
Element newStu=doc.createElement("学生");
newStu.setAttribute("学号", "03");
newStu.setAttribute("sex", "女");
Element new_Stu_age=doc.createElement("年龄");
new_Stu_age.setTextContent("30");
Element new_Stu_name=doc.createElement("名字");
new_Stu_name.setTextContent("马六");
Element new_stu_love=doc.createElement("爱好");
new_stu_love.setTextContent("睡觉");
newStu.appendChild(new_Stu_name);
newStu.appendChild(new_Stu_age);
newStu.appendChild(new_stu_love);
//把新的学生添加到根节点
doc.getDocumentElement().appendChild(newStu);
TransformerFactory tff=TransformerFactory.newInstance();
//得到一个转化器工厂
Transformer tf= tff.newTransformer();
tf.transform(new DOMSource(doc) , new StreamResult("src/XML用法/Classes.xml"));
}
//更新节点、属性
//(把第三个学生的名称改为宋江,并且将其sex属性更改为男)
public static void update(Document doc) throws TransformerException{
Element node=(Element) doc.getElementsByTagName("学生").item(2);
Element node_name=(Element) node.getElementsByTagName("名字").item(0);
node_name.setTextContent("五花");
node_name.setAttribute("类型","花心");
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.transform(new DOMSource(doc),new StreamResult("src/XML用法/Classes.xml"));
}
//删除元素
public static void del_ele(Document doc) throws TransformerException{
Element nodElement= (Element) doc.getElementsByTagName("学生").item(3);
nodElement.getParentNode().removeChild(nodElement);
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/XML用法/Classes.xml"));
}
//删除属性
public static void del_att(Document doc) throws TransformerException{
Element stu=(Element) doc.getElementsByTagName("名字").item(0);
stu.removeAttribute("sex");
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/XML用法/Classes.xml"));
}
}
|sax解析器技术:示例|
|dom4j解析技术:实例|
MyClass3.xm文件中的内容
<?xml version="1.0" encoding="UTF-8"?>
<班级>
<学生>
<名字 别名="小黑" sex="女">宋江</名字>
<年龄>20</年龄>
<介绍>很努力</介绍>
</学生>
<学生 别名="小白" sex="女">
<名字>辉辉</名字>
<年龄>21</年龄>
<介绍>很优秀</介绍>
</学生>
<学生/><学生/><学生 sex="男">
<名字>小明</名字>
<年龄>30</年龄>
<介绍>这是一个好孩子</介绍>
</学生>
<学生>
<名字>东东</名字>
<年龄/>
<介绍/>
</学生>
</班级>
MyClass3.java文件中的内容
import java.awt.List;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.sql.SQLException;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class MyClass03 {
public static void main(String[] args) throws DocumentException, IOException {
//得到解析器
SAXReader saxReader=new SAXReader();
//执行解析那个文件
Document document=saxReader.read(new File("src/XML用法/MyClass3.xml"));
// list(document.getRootElement());
// read(document);
// add(document);
// del(document);
// delAtt(document);
// update(document);//格式化异常
addByIndex(document);
}
//针对整个xml进行遍历
public static void list(org.dom4j.Element element){
System.out.println(element.getName()+":"+element.getTextTrim());
Iterator it=element.elementIterator();
while(it.hasNext()){
Element e= (Element) it.next();
list(e);
}
}
//指定读取某个元素
public static void read(Document document){
Element rootElement=document.getRootElement();
Element stuElement=(Element) rootElement.elements("学生").get(0);
//取出第一个学生下面的名字
String name_text=stuElement.element("名字").getText();
System.out.println(name_text);
String name=stuElement.element("名字").getName();
System.out.println(name+":"+name_text+" 别名:"+stuElement.element("名字").attributeValue("别名"));
}
//添加元素
public static void add(Document document) throws IOException{
Element newStu=DocumentHelper.createElement("学生");
Element newStu_name=DocumentHelper.createElement("名字");
newStu_name.setText("东东");
Element newStu_age=DocumentHelper.createElement("年龄");
Element newStu_inf=DocumentHelper.createElement("介绍");
//把三个子节点加到newStu下:
newStu.add(newStu_name);
newStu.add(newStu_age);
newStu.add(newStu_inf);
//再把newStu节点添加到根元素下面:
document.getRootElement().add(newStu);
//直接输出会导致中文乱码,要进行输出格式的设置
OutputFormat opfFormat= OutputFormat.createPrettyPrint();
opfFormat.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml"))) ;
writer.write(document);
writer.close();
}
//删除第一个元素
public static void del(Document document) throws IOException{
Element stu1=document.getRootElement().element("学生");
stu1.getParent().remove(stu1);
OutputFormat output=OutputFormat.createPrettyPrint();
output.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml")));
writer.write(document);
writer.close();
}
//删除属性
public static void delAtt(Document document) throws IOException{
//先找到该元素
Element stu=document.getRootElement().element("学生").element("名字");
//删除属性
stu.remove(stu.attribute("别名"));
OutputFormat output=OutputFormat.createPrettyPrint();
output.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml")));
writer.write(document);
writer.close();
}
//更新元素:所有学生的年龄增加3岁,并且把别名换成傻样
public static void update(Document document) throws IOException{
java.util.List<Element> stu=document.getRootElement().elements("学生");
for(Element element:stu){
Element ele_age=element.element("年龄");
System.out.println(((Integer.parseInt(ele_age.getText())+3)+""));
// ele_age.setText();
Element name= element.element("名字");
name.addAttribute("小名", "helloworld");
}
OutputFormat output=OutputFormat.createPrettyPrint();
output.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream(new File("src/XML用法/MyClass3.xml")));
writer.write(document);
writer.close();
}
//添加一个元素到指定的位置 在名字为辉辉的位置
public static void addByIndex(Document document) throws IOException{
Element newStu=DocumentHelper.createElement("学生");
Element newStu_name=DocumentHelper.createElement("名字");
//得到学生的List
java.util.List<Element> allList= document.getRootElement().elements("学生");
for(int i=0;i<allList.size();i++){
Element name=allList.get(i).element("名字");
if(name.getText().equals("辉辉")){
allList.add(i+1, newStu);
break;
}
}
//更新xml文件
OutputFormat output=OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(
new FileOutputStream(new File("src/XML用法/MyClass3.xml"))
);
writer.write(document);
writer.close();
}
}

浙公网安备 33010602011771号