java解析xml,java解析xml字符串

本文目錄一覽:

java的xml的解析方式有什麼,他們的解析流程是怎麼樣的,有什麼區別

答:4種。(或者說是兩種,因為JDOM和DOM4J是DOM的兩個特殊情況)

1.SAX解析

解析方式是事件驅動機制!

SAX解析器,逐行讀取XML文件解析,每當解析到一個標籤的開始/結束/內容/屬性時,觸發事件。

可以在這些事件發生時,編寫程序進行相應的處理。

優點:

分析能夠立即開始,而不是等待所有的數據被處理。

逐行加載,節省內存,有助於解析大於系統內存的文檔。

有時不必解析整個文檔,它可以在某個條件得到滿足時停止解析。

缺點:

1.單向解析,無法定位文檔層次,無法同時訪問同一個文檔的不同部分數據(因為逐行解析,當解析第n行時,第n-1行)已經被釋放了,無法再對其進行操作)。

2. 無法得知事件發生時元素的層次, 只能自己維護節點的父/子關係。

3. 只讀解析方式, 無法修改XML文檔的內容。

2. DOM解析

是用與平台和語言無關的方式表示XML文檔的官方W3C標準,分析該結構通常需要加載整個 文檔和內存中建立文檔樹模型。程序員可以通過操作文檔樹, 來完成數據的獲取 修改 刪除等。

優點:

文檔在內存中加載, 允許對數據和結構做出更改。訪問是雙向的,可以在任何時候在樹中雙向解析數據。

缺點:

文檔全部加載在內存中 , 消耗資源大。

3. JDOM解析

目的是成為Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一 個Java特定模型,JDOM一直得到大力推廣和促進。

JDOM文檔聲明其目的是「使用20%(或更少)的精力解決80%(或更多)Java/XML問題」 (根據學習曲線假定為20%)

優點:

使用具體類而不是接口,簡化了DOM的API。

大量使用了Java集合類,方便了Java開發人員。

缺點:

沒有較好的靈活性。

性能不是那麼優異。

4. DOM4J解析

它是JDOM的一種智能分支。它合併了許多超出基本XML文檔表示的功能,包括集成的XPath 支持、XML Schema支持以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項, DOM4J是一個非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一 個開放源代碼的軟件。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML。

目前許多開源項目中大量採用DOM4J , 例如:Hibernate。

java怎麼解析xml文件?

String xml=”xmlToUserName![CDATA[toUser]]/ToUserName”

+”FromUserName![CDATA[fromUser]]/FromUserName”

+”CreateTime12345678/CreateTime”

+”MsgType![CDATA[text]]/MsgType”

+”Content![CDATA[你好]]/Content/xml”;

try {

//加載xml字符串

org.dom4j.Document document=org.dom4j.DocumentHelper.parseText(xml);

//獲取根節點

org.dom4j.Element root=document.getRootElement();

//獲取值  ==toUser

String toUserName=root.elementText(“ToUserName”);

System.out.println(toUserName);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

在java在如何解析XML文件

在java環境下讀取xml文件的方法主要有4種:DOM、SAX、JDOM、JAXB

1. DOM(Document Object Model)

此方法主要由W3C提供,它將xml文件全部讀入內存中,然後將各個元素組成一棵數據樹,以便快速的訪問各個節點 。 因此非常消耗系統性能 ,對比較大的文檔不適宜採用DOM方法來解析。 DOM API 直接沿襲了 XML 規範。每個結點都可以擴展的基於 Node 的接口,就多態性的觀點來講,它是優秀的,但是在 Java 語言中的應用不方便,並且可讀性不強。

實例:

import javax.xml.parsers.*;

//XML解析器接口

import org.w3c.dom.*;

//XML的DOM實現

import org.apache.crimson.tree.XmlDocument;

//寫XML文件要用到

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

//允許名字空間

factory.setNamespaceAware(true);

//允許驗證

factory.setValidating(true);

//獲得DocumentBuilder的一個實例

try {

DocumentBuilder builder = factory.newDocumentBuilder();

} catch (ParserConfigurationException pce) {

System.err.println(pce);

// 出異常時輸出異常信息,然後退出,下同

System.exit(1);

}

//解析文檔,並獲得一個Document實例。

try {

Document doc = builder.parse(fileURI);

} catch (DOMException dom) {

System.err.println(dom.getMessage());

System.exit(1);

} catch (IOException ioe) {

System.err.println(ioe);

System.exit(1);

}

//獲得根節點StuInfo

Element elmtStuInfo = doc.getDocumentElement();

//得到所有student節點

NodeList nlStudent = elmtStuInfo.getElementsByTagNameNS(

strNamespace, “student”);

for (……){

//當前student節點元素

Element elmtStudent = (Element)nlStudent.item(i);

NodeList nlCurrent = elmtStudent.getElementsByTagNameNS(

strNamespace, “name”);

}

java解析xml的幾種方式哪種最好?

(1)DOM解析

DOM是html和xml的應用程序接口(API),以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許獲取;

(2)SAX(Simple API for XML)解析

流模型中的”推”模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法;

(1)、dom解析

dom解析是html和xml的應用程序接口(api) 以層次結構(類似與樹形)來組織節點 和信息片段 映射xml文檔的結構 允許獲取和操作文檔的任意部分 是官方標準

(2)、sax解析

流模型中in個的 推 模型 分析方式 通過事件驅動 沒發現一個節點就引發一個事件 事件推給事件處理期 遍歷回調方法

(3)、stax

流模型中的拉模型分析方式 提供基於指針和基於迭代器兩種方式 的支持1.6新特徵

(4)、jdom

java特定的文檔對象模型 自身不包含解析器 使用sax

(5)、jdom4j

簡單易用 採用java集合框架 兵完全支持dom sax 和jaxp

在java中xml有哪些解析技術

1.DOM生成和解析XML文檔

為 XML 文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM

接口來操作這個樹結構。優點:整個文檔樹在內存中,便於操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU)。

2.SAX生成和解析XML文檔

為解決DOM的問題,出現了SAX。SAX

,事件驅動。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,佔用資源少;SAX解析器代碼比DOM解析器代碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒保存數據,那麼數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬於哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少;

3.DOM4J生成和解析XML文檔

DOM4J 是一個非常非常優秀的Java XML

API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的 Java 軟件都在使用 DOM4J 來讀寫

XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。

4.JDOM生成和解析XML

為減少DOM、SAX的編碼量,出現了JDOM;優點:20-80原則,極大減少了代碼量。使用場合:要實現的功能簡單,如解析、創建等,但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。

新技術目前還木有,就是有了也不穩定,你也不敢用阿。

java解析xml有幾種方法

DOM(Document Object Model)解析

優點

允許應用程序對數據和結構做出更改

訪問是雙向的,可以在任何時候在樹中上、下導航獲取、操作任意部分的數據

缺點

解析XML文檔的需要加載整個文檔來構造層次結構,消耗內存資源大。

應用範圍

遍歷能力強,常應用於XML文檔需要頻繁改變的服務中。

解析步驟

創建一個 DocumentBuilderFactory 對象

創建一個 DocumentBuilder 對象

通過 DocumentBuilder 的 parse() 方法加載 XML 到當前工程目錄下

通過 getElementsByTagName() 方法獲取所有 XML 所有節點的集合

遍歷所有節點

通過 item() 方法獲取某個節點的屬性

通過 getNodeName() 和 getNodeValue() 方法獲取屬性名和屬性值

通過 getChildNodes() 方法獲取子節點,並遍歷所有子節點

通過 getNodeName() 和 getTextContent() 方法獲取子節點名稱和子節點值

package Paint;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

public class DOMTest {

public static void main(String[] args) {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

try {

DocumentBuilder db = dbf.newDocumentBuilder();

Document document = db.parse(“./src/Paint/hello.xml”);

NodeList bookList = document.getElementsByTagName(“book”); //節點集

int bookCnt = bookList.getLength();

System.err.println(“一共獲取到” + bookCnt +”本書”);

for(int i=0; i Node book = bookList.item(i);

NamedNodeMap attrs = book.getAttributes();

for(int j=0; j Node attr = attrs.item(j);

System.err.println(attr.getNodeName()+”—“+attr.getNodeValue());//id

}

NodeList childNodes = book.getChildNodes();

for(int k=0; k if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){

System.out.println(childNodes.item(k).getNodeName()+”—” + childNodes.item(k).getTextContent());

}

}

}

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

SAX(Simple API for XML)解析

優點

不需要等待所有的數據被處理,解析就可以開始

只在讀取數據時檢查數據,不需要保存在內存中

可以在某一個條件滿足時停止解析,不必要解析整個文檔

效率和性能較高,能解析大於系統內存的文檔

缺點

解析邏輯複雜,需要應用層自己負責邏輯處理,文檔越複雜程序越複雜

單嚮導航,無法定位文檔層次,很難同時同時訪問同一文檔的不同部分數據,不支持 XPath

解析步驟

獲取一個 SAXParserFactory 的實例

通過 factory() 獲取 SAXParser 實例

創建一個 handler() 對象

通過 parser 的 parse() 方法來解析 XML

SAXTest.java

package Paint;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SAXTest {

public static void main(String[] args) {

// 獲取實例

SAXParserFactory factory = SAXParserFactory.newInstance();

try {

SAXParser parser = factory.newSAXParser();

SAXParserHandler handler = new SAXParserHandler();

parser.parse(“./src/Paint/hello.xml”, handler);

System.err.println(“共有”+ handler.getBookList().size()+ “本書”);

for(Book book : handler.getBookList()){

System.out.println(book.getName());

System.out.println(“id=” + book.getId());

System.out.println(book.getAuthor());

System.out.println(book.getYear());

System.out.println(book.getPrice());

System.out.println(book.getLanguage());

}

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

SAXParserHandler.java

package Paint;

import java.util.ArrayList;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class SAXParserHandler extends DefaultHandler {

String value = null;

Book book = null;

private ArrayList bookList = new ArrayList();

public ArrayList getBookList() {

return bookList;

}

/*

* XML 解析開始

*/

public void startDocument() throws SAXException {

super.startDocument();

System.out.println(“xml 解析開始”);

}

/*

* XML 解析結束

*/

public void endDocument() throws SAXException {

super.endDocument();

System.out.println(“xml 解析結束”);

}

/*

* 解析 XML 元素開始

*/

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

super.startElement(uri, localName, qName, attributes);

if(qName.equals(“book”)){

book = new Book();

for(int i=0; i System.out.println(attributes.getQName(i)+”—“+attributes.getValue(i));

if(attributes.getQName(i).equals(“id”)){

book.setId(attributes.getValue(i));

}

}

}else if(!qName.equals(“bookstore”)){

System.out.print(“節點名:”+ qName + “—“);

}

}

/*

*解析 XML 元素結束

*/

public void endElement(String uri, String localName, String qName)

throws SAXException {

super.endElement(uri, localName, qName);

if(qName.equals(“book”)){

bookList.add(book);

book = null;

}

else if(qName.equals(“name”)){

book.setName(value);

}else if(qName.equals(“year”)){

book.setYear(value);

}else if(qName.equals(“author”)){

book.setAuthor(value);

}else if(qName.equals(“price”)){

book.setPrice(value);

}else if(qName.equals(“language”)){

book.setLanguage(value);

}

}

public void characters(char[] ch, int start, int length)

throws SAXException {

super.characters(ch, start, length);

// 獲取節點值數組

value = new String(ch, start, length);

if(!value.trim().equals(“”)){

System.out.println(“節點值:”+value);

}

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/236684.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:01
下一篇 2024-12-12 12:01

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中將字符串轉化為浮點數

    本文將介紹在Python中將字符串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字符串轉化為…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論