JAVA解析XML文件


 

XML文檔解析的方式4種
  1.SAX解析XML文件
  2.DOM解析XML文件
  3.JDOM解析XML文件
4.DOM4J解析XML文件

注意:XML文件的解析格式有兩種:SAX解析和DOM解析(DOM , JDOM , DOM4J )

 

下面就介紹一下JDOM解析XML文件

       步驟:
1.創建一個DOM解析器(文檔生成器)工廠對象
2.通過工廠對象創建一個DOM解析器對象
3.解析文檔
4.從內存中讀取數據生成對象
        特點:
1.基於樹型結構,
2.通過解析器一次性把文檔加載到內存中,所以會比較占用內存,
3.可以隨機訪問,更加靈活,適合web端開發.

public void SSSXML() throws IOException, SAXException, ParserConfigurationException {  //創建一個DOM解析器(文檔生成器)工廠對象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();  //通過工廠對象創建一個DOM解析器對象
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com\\xml\\person.xml"); //此代碼完成后,整個XML文檔已經被加載到內存中,以樹狀形式存儲;
        Document parse = documentBuilder.parse(resourceAsStream);  //4.從內存中讀取數據生成對象 //獲取節點名稱為person的所有節點,返回節點集合.
        NodeList personNodeList = parse.getElementsByTagName("person"); ArrayList<Person> persons = new ArrayList<>(); Person person = null; //循環讀取
        for (int i = 0; i < personNodeList.getLength(); i++) { Node personNode = personNodeList.item(i); person = new Person(); //獲取節點屬性值;
            String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue(); person.setPersonid(personid); //獲取當前節點的所有子節點
            NodeList childNodes = personNode.getChildNodes(); for (int j = 0; j <childNodes.getLength() ; j++) { Node item = childNodes.item(j); String nodeName = item.getNodeName(); if("name".equals(nodeName)){ person.setName(item.getFirstChild().getNodeValue()); }else if("address".equals(nodeName)){ person.setTel(item.getFirstChild().getNodeValue()); } else if("tel".equals(nodeName)){ person.setTel(item.getFirstChild().getNodeValue()); } else if("fax".equals(nodeName)){ person.setFax(item.getFirstChild().getNodeValue()); } else if("email".equals(nodeName)){ person.setEmail(item.getFirstChild().getNodeValue()); } } persons.add(person); } System.out.println("結果:"); for (Person person1 : persons) { System.out.println(person1); } }

 


DOM4J解析XML文件

         步驟:
1.創建DOM4J解析器
2.解析文檔
3.從內存中讀取數據生成對象
         特點:
1.基於樹型結構
2.第三方組件
3.解析速度快,效率更高,使用JAVA中的迭代器進行數據讀取,在web框架中使用較多,比如(Hibernate框架)

首先創建一個XML配置文件(解析這個文件需要導入dom4j-1.6.1.jar包,具體版本可能有新舊之分)

<?xml version="1.0" encoding="UTF-8"?>
<phoneInfo>2019-07-222019-07-22  
    <brand name="小米">
        <type name="小米8"/>
        <type name="小米9"/>
        <type name="小米MIX"/>
    </brand>
    <brand name="iphone">
        <type name="iphoneX"/>
        <type name="iphoneXs"/>
        <type name="iphone7"/>
    </brand>
    <brand name="華為">
        <type name="p20"/>
        <type name="p30"/>
        <type name="P30pro"/>
    </brand>
</phoneInfo>

下面就用這個XML文件實現增刪改查

1.查詢

package cn.kgc.dom4jtest; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.util.Iterator; public class Test { public static void main(String[] args) { //創建DOM4J解析器對象
        SAXReader saxReader = new SAXReader(); try { //讀取xml文件,並生成document對象 現可通過document來操作文檔
            Document document = saxReader.read("src/info.xml"); //獲取到文檔的根節點
            Element rootElement = document.getRootElement(); System.out.println("根節點的名字是:" + rootElement.getName()); //獲取子節點列表
            Iterator it = rootElement.elementIterator(); while (it.hasNext()) { Element fistChild = (Element) it.next(); //System.out.println(fistChild.getName()); //獲取節點的屬性值
                System.out.println(fistChild.attribute("name").getValue()); //獲取子節點的下一級節點
                Iterator iterator = fistChild.elementIterator(); while (iterator.hasNext()) { Element element = (Element) iterator.next(); System.out.println("\t" + element.attributeValue("name")); } } } catch (DocumentException e) { e.printStackTrace(); } } }

2.添加

package cn.kgc.dom4jtest; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class AddTest1 { /** * 添加節點操作 * @param args */
    public static void main(String[] args) { //創建DOM4J解析器對象
        SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("src/info.xml"); //獲取到根節點
            Element rootElement = document.getRootElement(); //添加一個子節點
            Element brand = rootElement.addElement("brand"); //給當前節點添加屬性
            brand.addAttribute("name", "魅族"); Element type = brand.addElement("type"); type.addAttribute("name", "s16"); OutputStream os = new FileOutputStream(new File("src/info.xml")); XMLWriter xmlWriter = new XMLWriter(os); xmlWriter.write(rootElement); xmlWriter.flush(); } catch (Exception e) { e.printStackTrace(); } } }

 

3.修改

package cn.kgc.dom4jtest; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.File; import java.io.FileOutputStream; import java.util.Iterator; /** * 節點修改測試 */
public class UpdateTest { public static void main(String[] args) { //創建DOM4J解析器對象
        SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("src/info.xml"); //獲取根節點
            Element rootElement = document.getRootElement(); Iterator it = rootElement.elementIterator(); while (it.hasNext()) { Element element = (Element) it.next(); System.out.println(element.attributeValue("name")); if (element.attributeValue("name").equals("魅族")) { Iterator iterator = element.elementIterator(); while (iterator.hasNext()) { Element type = (Element) iterator.next(); if (type.attributeValue("name").equals("s16")) { type.addAttribute("name", "16 pro"); } } } } XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("src/info.xml"))); xmlWriter.write(document); xmlWriter.flush(); } catch (Exception e) { e.printStackTrace(); } } }

 

4.刪除

package cn.kgc.dom4jtest; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.File; import java.io.FileOutputStream; import java.util.Iterator; /** * 刪除節點測試 */
public class DeleteTest { public static void main(String[] args) { SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read("src/info.xml"); Element rootElement = document.getRootElement(); Iterator iterator = rootElement.elementIterator(); while (iterator.hasNext()) { Element brand = (Element) iterator.next(); if ("魅族".equals(brand.attributeValue("name"))) { //通過父節點來刪除子節點
 brand.getParent().remove(brand); } } XMLWriter xmlwriter = new XMLWriter(new FileOutputStream(new File("src/info.xml"))); xmlwriter.write(document); xmlwriter.flush(); } catch (Exception e) { e.printStackTrace(); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM