xml編程
爲什麼要學習xml編程(就是對xml文件進程crud操作)
1.xml作爲數據傳遞,需要解析
2.xml作爲配置文件,需要讀取.
3.xml作爲小型數據庫.crud
在j2ee 技術中,主要是學習 java 對xml 操作 ,和 js 對 xml操作
目前有兩種模式
dom 是 w3c 推出的標準
sax 是社區的標準
我們在授課中,主要講三套api
dom sax dom4j
java 解析xml 【dom技術】 看原理:
我們講一個快速入門案例:
<?xml version="1.0" ?>
<班級>
<學生>
<名字>周星馳</名字>
<年齡>23</年齡>
<介紹>學習刻苦</介紹>
</學生>
<學生>
<名字>林青霞</名字>
<年齡>32</年齡>
<介紹>是一個好學生</介紹>
</學生>
</班級>
代碼:
package two;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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.Node;
import org.w3c.dom.NodeList;
public class Test {
//使用dom技術對xml文件進行crud操作
public static void main(String args[])throws Exception{
//創建一個DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//通過DocumentBuilderFactory,得到一個DocumentBuilder對象
DocumentBuilder dBuilder=dbf.newDocumentBuilder();
//指定解析那個xml文件
Document document=dBuilder.parse("src/two/class.xml");
//read(document);
//list(document);
//add(document);
//del(document);
upd(document);
}
//使用dom去遍歷xml文件和指定獲取某個節點
//具體地查詢某個學生的信息(顯示第一個學生的所有信息)
//請考慮如何獲取某個元素的屬性值(取出)
public static void read(Document doc){
NodeList n1=doc.getElementsByTagName("學生");
//取出第一個學生
Element stu=(Element)n1.item(0);
System.out.println("學生的性別是"+stu.getAttribute("sex"));
Element name=(Element)stu.getElementsByTagName("年齡").item(0);
System.out.println(name.getTextContent());
System.out.println("發現"+n1.getLength()+"個學生");
}
//遍歷該xml文件
public static void list(Node node){
if(node.getNodeType()==node.ELEMENT_NODE){
System.out.println("名字:"+node.getNodeName());
}
//System.out.println("名字:"+node.getNodeName());
//取出node的子節點
NodeList nodeList=node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
//再去顯示
Node n=nodeList.item(i);
list(n);
}
}
//增加一個學生到xml中
public static void add(Document doc)throws Exception{
//創建一個新的學生節點
Element newStu=doc.createElement("學生");
//添加一個屬性值
newStu.setAttribute("sex", "男");
Element newStu_name=doc.createElement("名字");
newStu_name.setTextContent("小明2");
Element newStu_age=doc.createElement("年齡");
newStu_age.setTextContent("34");
Element newStu_intro=doc.createElement("介紹");
newStu_intro.setTextContent("這是一個好孩子");
newStu.appendChild(newStu_name);
newStu.appendChild(newStu_age);
newStu.appendChild(newStu_intro);
//把新的學生節點添加到根元素
doc.getDocumentElement().appendChild(newStu);
//更新,不然添加的數據只能出現在內存中,在文件中沒有更改
//得到TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通過TransformerFactory得到一個轉換器
Transformer tf=tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/two/class.xml"));
}
//刪除一個元素(如:小明2,學生)
public static void del(Document doc)throws Exception{
//首先找到這個學生
//Node node=doc.getElementsByTagName("學生").item(0);
//node.getParentNode().removeChild(node);
//刪除學生的sex屬性
Element node=(Element)doc.getElementsByTagName("學生").item(0);
node.removeAttribute("sex");
//更新xml
//得到TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通過TransformerFactory得到一個轉換器
Transformer tf=tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/two/class.xml"));
}
//更新操作
public static void upd(Document doc)throws Exception{
//找到
Element node=(Element)doc.getElementsByTagName("學生").item(0);
Element node_name=(Element)node.getElementsByTagName("名字").item(0);
node_name.setTextContent("宋江");
//node_name.setAttribute("sex", "男");
//更新xml
//得到TransformerFactory
TransformerFactory tff=TransformerFactory.newInstance();
//通過TransformerFactory得到一個轉換器
Transformer tf=tff.newTransformer();
tf.transform(new DOMSource(doc), new StreamResult("src/two/class.xml"));
}
}
xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班級>
<學生>
<名字>宋江</名字>
<年齡>23</年齡>
<介紹>學習刻苦</介紹>
</學生>
<學生 sex="女">
<名字>林青霞</名字>
<年齡>32</年齡>
<介紹>是一個好學生</介紹>
</學生>
<學生 sex="男"><名字>小明2</名字><年齡>34</年齡><介紹>這是一個好孩子</介紹></學生></班級>