JavaSE XML操作

来源:互联网 发布:tcpip网络层安全协议 编辑:程序博客网 时间:2024/06/03 07:18

XML操作

HTML与XML区别

Html:超文本标记语言,属于解析型语言,不需要编译就可以运行,浏览器可以直接解析,一个网页从服务器到浏览器就是通过发送Html文件格式,采用标签来存储数据,作用是用来展示数据,不区分大小写

XML:可扩展性标记语言,用于存储数据,XML文件格式非常有利于计算机之间的数据传送,区分大小写,由开始标签和结束标签构成,有且只有一个根节点

DTD

文档类型的定义,用于约束XML,内容包括,元素定义规则,属性定义规则,元素之间的关系

?:0-1次子元素

*:0-N次子元素

+:1-N次子元素

DOM解析

dom:Document Object Model 文档对象模型

主要对象

1.      Document:表示整个XML文档

    [1]    getElementByTagName(String),

    [2]    getDocumentElement()//得到根节点

2.      NodeList:表示XML文档节点集合

    [1]    item(index)

3.      Node:表示XML文档节点

    [1]    getChildNodes()

    [2]    getNodeName()

    [3]    getNodeValue()

    [4]    getTextContent()

4.      Element:表示文档元素,与node对等

    [1]    getAttribute(attr_name:String)

解析过程:




DOM加载xml
static {// 1.创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 2.根据解析器工厂获得解析器对象DocumentBuilder builder;try {builder = factory.newDocumentBuilder();//加载XML文档document = builder.parse(path);} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

DOM查询
public void show() {//Element root = document.getDocumentElement();//取出根节点NodeList list = document.getElementsByTagName("student");//取出所有的student标签System.out.println("node sum : " + list.getLength());System.out.println("===================================");for(int i=0; i<list.getLength(); i++) {Node node = list.item(i);//取节点的属性必须转换为Element对象Element element = (Element)node;System.out.println("id = " + element.getAttribute("id"));for(Node n = node.getFirstChild(); n != null; n = n.getNextSibling()) {if(n.getNodeType() == Node.ELEMENT_NODE) {if(!n.getNodeName().equals("scores")) {System.out.println(n.getNodeName() + " = " + n.getFirstChild().getTextContent());} else {System.out.println(n.getNodeName() + " :");int flag = 1;for(Node cn = n.getFirstChild(); cn != null; cn = cn.getNextSibling() ) {if(cn.getNodeType() == Node.ELEMENT_NODE) {System.out.println("\t" + cn.getNodeName() + "_" + (flag++) + " = " + cn.getTextContent());}}}}}System.out.println("===================================");}}

DOM保存节点
//保存 dom 到 xml 文档,问题:不会保存 dtd 约束public void save() {TransformerFactory factory = TransformerFactory.newInstance();try {Transformer transformer = factory.newTransformer();DOMSource source = new DOMSource(document);StreamResult result = new StreamResult(path);transformer.transform(source, result);} catch (TransformerConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (TransformerException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

DOM添加
//向 xml文件添加一个节点public void add() {String name = "赵珊珊";String id = "1004";String sex = "女";String age = "20";String phone = "15874862470";// 创建 student 节点Element element = document.createElement("student");// 创建 id 属性并赋值Attr idAttr = document.createAttribute("id");idAttr.setValue(id);//把 id 属性加入到 student 节点中element.setAttributeNode(idAttr);//创建 name 子节点Element nameEle = document.createElement("name");nameEle.setTextContent(name);element.appendChild(nameEle);//创建 sex 子节点Element sexEle = document.createElement("sex");sexEle.setTextContent(sex);element.appendChild(sexEle);//创建 age 子节点Element ageEle = document.createElement("age");ageEle.setTextContent(age);element.appendChild(ageEle);//创建 phone 子节点Element phoneEle = document.createElement("phone");phoneEle.setTextContent(phone);element.appendChild(phoneEle);//把 student 节点加入到根节点的子节点中document.getDocumentElement().appendChild(element);//保存 dom 到 xml 文件中save();}

DOM删除
public void delete() {String id = "1004";//取所有的 Student 节点集合NodeList list = document.getElementsByTagName("student");//循环每一个 student 节点for(int i = 0; i < list.getLength(); i++) {Node n = list.item(i);Element e = (Element) n;//取得节点的 id 值String idStr = e.getAttribute("id");//如果当前节点 id 与要删除的接的的 id 匹配if(idStr.equals(id)) {//用当前节点的父节点来移除子节点n.getParentNode().removeChild(n);break;}}//更新文档save();}

DOM修改
public void update() {String id = "1004";//取所有的 Student 节点集合NodeList list = document.getElementsByTagName("student");//循环每一个 student 节点for(int i = 0; i < list.getLength(); i++) {Node n = list.item(i);Element e = (Element) n;//取得节点的 id 值String idStr = e.getAttribute("id");//如果当前节点 id 与要删除的接的的 id 匹配if(idStr.equals(id)) {//用当前节点的父节点来移除子节点for(Node cn = n.getFirstChild(); cn != null; cn = cn.getNextSibling() ) {if(cn.getNodeType() == Node.ELEMENT_NODE) {if(cn.getNodeName().equals("name")) {cn.setTextContent("另一个人");}}}break;}}//更新文档save();}


DOM4J解析
package com.etc.homework.dom4j;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class StudentManage {static Document document;static String path = "test/xml/student.xml";static {SAXReader reader = new SAXReader();try {document = reader.read(new File(path));} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@SuppressWarnings("unchecked")public void show() {//通过 document 对象获取根节点Element root = document.getRootElement();//通过 elements() 方法获取当前节点的所有子节点List<Element> list = root.elements();//遍历子节点集合,for(Element student : list) {//获得叫 id 的属性并取得属性值,输出System.out.println("id : " + student.attribute("id").getValue());List<Element> elements = student.elements();//遍历 student 节点下的所有子节点for (Element el : elements) {//如果是 scores 节点,则继续深度搜索,否则输出节点名和节点值if(el.getName().equals("scores")) {List<Element> scores = el.elements();System.out.print( el.getName() +" : " );for(Element score : scores) {System.out.print( "    " +score.getTextTrim() );}System.out.println();} else System.out.println( el.getName() +" : "+el.getTextTrim() );}System.out.println();}}public void add(Student stu) {//获取根元素并为根元素创建一个子元素Element root = document.getRootElement();Element student = root.addElement("student");//给子元素设置属性 id, 值为 1004student.addAttribute("id", stu.getId());//给 student 子元素添加子元素并添加文本Element el = student.addElement("name");el.setText(stu.getName());student.addElement("sex").setText(stu.getSex());student.addElement("age").setText(stu.getAge());student.addElement("phone").setText(stu.getPhone());//保存save();}@SuppressWarnings("unchecked")public void update(Student stu) {//获取根元素并为根元素创建一个子元素Element root = document.getRootElement();//得到根元素的所有子节点List<Element> list = root.elements();//遍历子元素集合for(Element student : list) {//如果当前元素节点的id属性的值与要修改的id的值一致if(student.attribute("id").getValue().equals(stu.getId())) {//得到该元素下的所有子元素节点List<Element> params = student.elements();//遍历子元素节点并按对应位置修改值for(Element param : params) {String type = param.getName();if(type.equals("name")) {param.setText(stu.getName());} else if(type.equals("sex")) {param.setText(stu.getSex());} else if(type.equals("age")) {param.setText(stu.getAge());} else if(type.equals("phone")) {param.setText(stu.getPhone());}}}}//保存dom到xmlsave();}@SuppressWarnings("unchecked")public void delete(String id) {//获取根元素并为根元素创建一个子元素Element root = document.getRootElement();//根据根元素获取子元素节点集合List<Element> list = root.elements();//遍历集合并找到与要删除的元素节点id一致的节点for(Element student : list) {if(student.attribute("id").getValue().equals(id)) {//通过该节点的父节点元素删除该节点元素student.getParent().remove(student);}}//保存dom到xmlsave();}private void save() {OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");//指定保存的XML文件编码XMLWriter writer = null;try {writer = new XMLWriter(new FileOutputStream(path), format);writer.write(document);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}





原创粉丝点击