日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

xml的創建,解析

  • 1. 什么是xml文件
    • 1.1 什么是xml文件
    • 1.2 解析xml的方式,優缺點
  • 2. 使用dom操作xml文件
    • 2.1 使用dom創建xml文件
    • 2.2 使用dom解析xml文件
    • 2.3 使用dom對xml文件增刪改
  • 3. 使用SAX解析xml文件
  • 4. 使用DOM4J操作xml文件
    • 4.1 使用DOM4J創建xml文件
    • 4.2 使用DOM4J解析xml文件

1. 什么是xml文件

1.1 什么是xml文件

可標記的擴展語言(文本文件) 類似html文件,xml標簽有頭有尾部。可讀性高。
xml的實際用途:
1.數據存儲和傳遞的媒介
2.作為配置文件

  • XML中的相關概念(叫法)
  • 按級別來分
    a:根節點(有且只能有一個)
    b:父節點
    c:子節點
    d:兄弟節點
  • 按類型來分
    a:元素節點
    b:屬性節點
    c:文本節點
  • 如下就是一個xml文件

1.2 解析xml的方式,優缺點

  • 使用Java操作xml文件,有DOM和SAX
  • 優缺點比較

DOM的特點:

  • 在操作xml文檔時需要將整個文檔加載到內存,操作靈活方便,但對內存消耗過大
  • 功能齊全,能創建/解析xml文檔,能刪除/添加/修改節點信息
    SAX的特點:(事件驅動模式)
  • 在操作xml文檔時是從上到下來加載xml,操作沒有dom那么靈活,但內存消耗較dom要小
  • 功能沒有dom齊全,只能創建/解析xml
  • dom4j:

  • 集dom和sax的特點于一起
  • 功能更強大
  • 2. 使用dom操作xml文件

    2.1 使用dom創建xml文件

    • 下面創建了person.xml 和 stu.xml
    • 直接用排版印刷懟 和 封裝好排版和印刷
    package test;import java.io.File;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.NodeList;/*** * @author echo lovely* * dom模式下的* xml文件的解析,讀取,增刪改* * 優缺點:* 1. 消耗內存大,把整個xml讀到內存,適合數據少的讀取* 2. 靈活,可對整個xml文檔進行操作,操作父子,兄弟,第一個,最后一個結點* * 排版:* DocumentBuliderFactory BuilderFactory Document* * 印刷:* TransformerFactory Transformer transfome* */ public class DocumentXMLNode {public static void main(String[] args) throws Exception {// createNew();// parserXML();// DOMAddXML();// DOMUpdateXML();DOMDeleteXML();}// one by onestatic void createXML() throws Exception {// 創建一個排版工廠DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 創建一個排版機器DocumentBuilder db = factory.newDocumentBuilder();// 準備好空白文檔,準備排版Document doc = db.newDocument();// 創建根節點Element root = doc.createElement("Student");// 把根結點掛載到文檔中doc.appendChild(root);for (int i = 0; i < 3; i ++) {// 創建stu結點Element stu = doc.createElement("stu" + (i + 1));// 把元素結點添加到stu結點下root.appendChild(stu);// 設置element的屬性stu.setAttribute("id",(i + 1) + "");// 創建學生的姓名結點Element name = doc.createElement("name");name.setTextContent("小明" + i);stu.appendChild(name);// 學生的年齡結點Element age = doc.createElement("age");age.setTextContent("" + (18 + i));stu.appendChild(age);}// 印刷// 創建印刷工場TransformerFactory tff = TransformerFactory.newInstance();// 印刷機器Transformer tf = tff.newTransformer();// 開始印刷// 創建xml數據源DOMSource source = new DOMSource(doc);// 確定輸出位置StreamResult res = new StreamResult("stu.xml");tf.transform(source, res); }// 排版 or 解析static Document DOMComposing(String path) throws Exception {// 排版工場DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// 排版機器DocumentBuilder db = dbf.newDocumentBuilder();Document doc = null;// 空白文檔,準備排版if (path == "" || path == null)doc = db.newDocument();else doc = db.parse(path); // 解析xmlreturn doc;}/*** @param doc 排版文檔* @param xml文件輸出路徑* @throws Exception */static void DOMPrinting(Document doc, String outputPath) throws Exception {// 排版工場TransformerFactory tff = TransformerFactory.newInstance();// 排版機器Transformer tf = tff.newTransformer();// 數據源DOMSource xmlSource = new DOMSource(doc);// 輸出地址,開始排版 file:/// 中文路徑亂碼StreamResult res = new StreamResult(new File(outputPath));tf.transform(xmlSource, res);}// hide difficultiesstatic void createNew() {try {Document doc = DOMComposing("");Element root = doc.createElement("person");doc.appendChild(root);for (int i = 0; i < 3; i ++) {Element teacher = doc.createElement("teacher");teacher.setAttribute("id", "" + (i + 1));root.appendChild(teacher);Element name = doc.createElement("name");// 設置name結點的文本內容name.setTextContent("cici" + (i + 1));Element age = doc.createElement("age");age.setTextContent((24 + i) + "");// 把姓名和年齡添加到teacher結點teacher.appendChild(name);teacher.appendChild(age);}DOMPrinting(doc, "person.xml");} catch (Exception e) {e.printStackTrace();}}static void parserXML() throws Exception {// 排版解析DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();// 解析xmlDocument doc = db.parse(new File("stu.xml"));// Element root = (Element) doc.getFirstChild();Element root = doc.getDocumentElement();NodeList nodes = root.getChildNodes();System.out.println(nodes.item(0));for (int i = 0; i < nodes.getLength(); i++) {Element stu = (Element) nodes.item(i);String text = nodes.item(i).getFirstChild().getTextContent();System.out.println(stu.getAttribute("id") + "\t" + text);}} }
    • element獲取結點的其它方式
    Element root = doc.getDocumentElement();root.getFirstChild();//獲得當前節點第一個子節點root.getLastChild();//獲得當前節點最后一個子節點root.getNextSibling();//獲得當前節點下一個兄弟節點root.getPreviousSibling();//獲得當前節點上一個兄弟節點root.getParentNode();//獲得當前節點父節點

    2.2 使用dom解析xml文件

    • 對books.xml解析
    static void domParse() {Document doc = docComposing("books.xml");Element root = (Element) doc.getFirstChild();NodeList list = root.getChildNodes();for (int i = 0; i < list.getLength(); i++) {Element book = (Element) list.item(i);System.out.println(book.getAttribute("id") + "\t" + book.getTextContent());}}/** 1001 java 1002 c# */

    2.3 使用dom對xml文件增刪改

    • 如圖
    static void DOMAddXML() {try {Document doc = DOMComposing("person.xml");// 得到第二個name結點下面的第一個結點Element name = (Element) doc.getFirstChild().getFirstChild().getNextSibling().getFirstChild();// System.out.println(name.getTextContent() + "--" + name.getAttribute("id"));// 創建gender結點Element gender = doc.createElement("gender");name.getParentNode().appendChild(gender);gender.setTextContent("female");DOMPrinting(doc, "person.xml");} catch (Exception e) {e.printStackTrace();}}static void DOMUpdateXML() {try {Document doc = DOMComposing("person.xml");doc.getDocumentElement().getLastChild().setTextContent("null");DOMPrinting(doc, "person.xml");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}static void DOMDeleteXML() {try {Document doc = DOMComposing("person.xml");Element beRemoved = (Element) doc.getDocumentElement().getLastChild();beRemoved.getParentNode().removeChild(beRemoved);DOMPrinting(doc, "person.xml");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}

    3. 使用SAX解析xml文件

    • 繼承DefaultHander類
    package test;import java.util.ArrayList;import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;import entity.Person;public class MyDefaultHandler extends DefaultHandler {private ArrayList<Person> list;private Person p;private String tagName;// 重寫public MyDefaultHandler(ArrayList<Person> list) {this.list = list;}@Overridepublic void startDocument() throws SAXException {System.out.println("解析根節點");}@Overridepublic void endDocument() throws SAXException {System.out.println("根結點解析結束");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {this.tagName = qName; // 標記元素結點的值if ("teacher".equals(qName)) { // 開始解析第一個teacher結點 準備進行數據封裝p = new Person(); // 有幾個結點便會產生幾個person 對象System.out.println(p);list.add(p);p.setId(Integer.parseInt(attributes.getValue("id")));}System.out.println("元素結點解析開始 " + qName);}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// System.out.println("元素結點解析結束... ");}// 文本結點值public void characters(char[] ch, int start, int length)throws SAXException {String value = new String(ch, start, length);if ("name".equals(tagName)) {p.setName(value);} else if ("age".equals(tagName)) {p.setAge(Integer.parseInt(value));} else if ("gender".equals(tagName)) {p.setGender(value);} System.out.println("文本元素值 " + value);} }
    • person實體
    package entity;public class Person {// 用于存儲xml集合保存的數據private Integer id;private Integer age;private String name;private String gender;public Person() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;} public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Override public String toString() {return "Person [id=" + id + ", age=" + age + ", name=" + name+ ", gender=" + gender + "]";}}
    • sax解析
    package test;import java.io.IOException; import java.util.ArrayList;import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import entity.Person;public class SAXParseXML {public static void main(String[] args) {// 使用sax解析xmlSAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp = null;ArrayList<Person> list = new ArrayList<Person>();try {sp = spf.newSAXParser();sp.parse("person.xml", new MyDefaultHandler(list));} catch (ParserConfigurationException | SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println(list);}}/** *[Person [id=1, age=24, name=cici1, gender=female], Person [id=2, age=25, name=cici2, gender=female], Person [id=3, age=26, name=cici3, gender=null]]*/

    4. 使用DOM4J操作xml文件

    4.1 使用DOM4J創建xml文件

    • 創建如圖所示的xml

    • 使用dom4j前提

    • coding…
    package test;import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter;import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.XMLWriter;public class Dom4jCreateXML {public static void main(String[] args) {// xml文檔對象Document doc = DocumentHelper.createDocument();// 根節點對象Element root = doc.addElement("Students");// 第一個學生結點Element stu1 = root.addElement("student");stu1.addAttribute("id", "1");// 添加姓名結點stu1.addElement("name").addText("rye");// 添加性別結點stu1.addElement("gender").addText("female");// 可以在創建學生結點的同時添加id屬性Element stu2 = root.addElement("student").addAttribute("id", 2 + "");stu2.addElement("name").addText("jack");stu2.addElement("gender").addText("male");Element stu3 = root.addElement("student").addAttribute("id", 3 + "");stu3.addElement("name").addText("rose");stu3.addElement("gender").addText("male");// 利用XMLWriter把內存中的xml 寫入文件XMLWriter w = null;try {w = new XMLWriter(new OutputStreamWriter(new FileOutputStream("student.xml"), "utf-8"));w.write(doc);} catch (IOException e) {e.printStackTrace();} finally {try {if (w != null)w.close();} catch (IOException e) {e.printStackTrace();}}}}

    4.2 使用DOM4J解析xml文件

    package test;import java.util.List;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader;public class DOM4jParseXML {@SuppressWarnings("unchecked")public static void main(String[] args) {// SAXReader 讀取xml文件SAXReader reader = new SAXReader();Document doc = null;try {doc = reader.read("student.xml");} catch (DocumentException e) {e.printStackTrace();}// 根節點studentsElement root = doc.getRootElement();List<Element> list = root.elements();// 拿到每個學生結點的名字和姓名for (Element stu : list) {// stu.element("name"); 拿到name結點// 獲取屬性值idSystem.out.println(stu.attributeValue("id"));System.out.println(stu.elementText("name") + "\t" + stu.elementText("gender"));}// 記住! 語法有 有斜杠 必須導入jaxen-1.1.6.jar List<Element> nameNodes = root.selectNodes("//name");nameNodes = doc.selectNodes("//student/name");nameNodes = doc.selectNodes("//student/gender");for (Element name : nameNodes) {System.out.println(name.getName() + "\t" + name.getText());}// 拿到單個結點Node stuNode1 = doc.selectSingleNode("//Students/student[@id='1']/name");System.out.println(stuNode1.getName() + "\t " + stuNode1.getText());}}/** 1 rye female 2 jack male 3 rose male gender female gender male gender male name rye */

    最后使用dom4j工具類雖然能給我們簡化大量解析xml的代碼,但是還是得了解jdk提供的api解析原理。

    總結

    以上是生活随笔為你收集整理的使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。