java解析嵌套xml(java函數嵌套定義)

本文目錄一覽:

java XML解析詳解

(I)Java通過DOM解析XML

1得到DOM解析器的工廠實例

DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();

得到javax.xml.parsers.DocumentBuilderFactory;類的實例就是我們要的解析器工廠

2從DOM工廠獲得DOM解析器

DocumentBuilder dombuilder=domfac.newDocumentBuilder();

通過javax.xml.parsers.DocumentBuilderFactory實例的靜態方法newDocumentBuilder()得到DOM解析器

3把要解析的XML文檔轉化為輸入流,以便DOM解析器解析它

InputStream is=new FileInputStream(“bin/library.xml”);

InputStream是一個介面。

4解析XML文檔的輸入流,得到一個Document

Document doc=dombuilder.parse(is);

由XML文檔的輸入流得到一個org.w3c.dom.Document對象,以後的處理都是對Document對象進行的

5得到XML文檔的根節點

Element root=doc.getDocumentElement();

在DOM中只有根節點是一個org.w3c.dom.Element對象。

6得到節點的子節點

NodeList books=root.getChildNodes();

for(int i=0;ibooks.getLength();i++){

Node book=books.item(i);

}

這是用一個org.w3c.dom.NodeList介面來存放它所有子節點的,還有一種輪循子節點的方法,後面有介紹

7取得節點的屬性值

String email=book.getAttributes().getNamedItem(“email”).getNodeValue();

System.out.println(email);

注意,節點的屬性也是它的子節點。它的節點類型也是Node.ELEMENT_NODE

8輪循子節點

for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){

if(node.getNodeType()==Node.ELEMENT_NODE){

if(node.getNodeName().equals(“name”)){

String name=node.getNodeValue();

String name1=node.getFirstChild().getNodeValue();

 …

if(node.getNodeName().equals(“price”)){

String price=node.getFirstChild().getNodeValue();

Java通過SAX解析XML

Simple API for XML(簡稱SAX)是個循序存取XML的解析器API。

一個實現SAX的解析器(也就是「SAX Parser」)以一個串流解析器的型式作用,擁有事件驅動API。由使用者定義回調函數,解析時,若發生事件的話會被調用。SAX事件包括:

XML 文字 節點

XML 元素 節點

XML 處理指令

XML 注釋

Java代碼

person

user

username謝成志/username

password6626310xie/password

sex男/sex

birthday1988/11/28/birthday

headpic

pictitleermao/pictitle

picurlimages/head1.jpg/picurl

/headpic

/user

/person

此為下面即將解析度簡單xml結構,並將其封裝成一個User對象。

////////////////////////////////////////////////////////////////////////////////////

Java代碼

span style=”font-family: courier new,courier; font-size: small;”package com.xcz.xml;

import java.io.File;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

import com.xcz.util.SaxUtil;

public class Sax4XML {

public static void main(String[] args) {

try {

//1.獲取factory

SAXParserFactory factory = SAXParserFactory.newInstance();

//2.獲取parser

SAXParser parser = factory.newSAXParser();

//3.獲取解析時的監聽器對象

SaxUtil su = new SaxUtil();

//4.開始解析

parser.parse(new File(“src/user-params.xml”), su);

System.out.println(su.getUser());

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/span

////////////////////////////////////////////////////////////////////////////////////

Java代碼

span style=”font-family: courier new,courier; font-size: small;”package com.xcz.util;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import com.xcz.po.HeadPic;

import com.xcz.po.User;

/**

* 定義xml解析時的監聽類

*

* 實現方式有很多,可以實現介面:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler

* 但我們常用的繼承:DefaultHandler

*/

public class SaxUtil extends DefaultHandler {

private User user;

private HeadPic headPic;

private String content;

private SimpleDateFormat sdf = new SimpleDateFormat(“yyyy/MM/dd”);

@Override

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

throws SAXException {

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

}

//當解析到文本開始時觸發

@Override

public void startDocument() throws SAXException {

super.startDocument();

}

//當解析到文本結束時觸發

@Override

public void endDocument() throws SAXException {

super.endDocument();

}

//當解析到元素開始時觸發

@Override

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

Attributes attributes) throws SAXException

{

if(“user”.equals(name))

{

user = new User();

}

if(“headpic”.equals(name))

{

headPic = new HeadPic();

}

}

//當解析到元素結束時觸發

@Override

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

throws SAXException

{

if(“username”.equals(name))

{

user.setUsername(content);

}

if(“password”.equals(name))

{

user.setPassword(content);

}

if(“sex”.equals(name))

{

user.setSex(content);

}

if(“birthday”.equals(name))

{

try {

user.setBirthday(sdf.parse(content));

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if(“pictitle”.equals(name))

{

headPic.setPicTitle(content);

}

if(“picurl”.equals(name))

{

headPic.setPicUrl(content);

user.setHeadPic(headPic);

}

}

public User getUser(){

return user;

}

}/span

[優點]

(1).節約內存開銷

SAX解析器在某些方面優於DOM風格解析器,因為SAX解析器的內存使用量一般遠低於DOM解析器使用量。DOM解析器在任何處理開始之前,必須將xml以整棵樹放在內存,所以DOM解析器的內存使用量完全根據輸入資料的大小。相對來說,SAX解析器的內存內容,是只基於XML檔案的最大深度(XML樹的最大深度)和單一XML項目上XML屬性儲存的最大資料。

(2)解析速度快

因為SAX事件驅動的本質,處理文件通常會比DOM風格的解析器快。

[缺點]

SAX事件驅動的模型對於XML解析很有用,但它確實有某些缺點。

某些種類的XML驗證需要存取整份文件。例如,一個DTD IDREF屬性需要文件內有項目使用指定字串當成DTD ID屬性。要在SAX解析器內驗證,必須追蹤每個之前遇過的ID和IDREF屬性,檢查是否有任何相符。更甚者,一個IDREF找不到對應的ID,使用者只會在整份文件都解析完後才發現,若這種連結對於建立有效輸出是重要的,那用在處理整份文件的時間只是浪費。

如何用java封裝解析一個多層次的XML文件,急求大神幫助

下面提供了XML解析成實體類,以及實體類轉換成xml的方法。

public class SwitchXML {

private XStream xStream = new XStream();

private String xmlPath = “D:/data.xml”;

// 1. obj – xml(object類型轉換為xml類型)

public String printXML(User user) {

System.out.println(“obj – xml”);

String xml = xStream.toXML(user);

System.out.println(xml);

return xml;

}

// 2. xml-obj(xml類型轉換為object類型,並列印)

public void printObj(String xml) {

System.out.println(“xml – obj”);

User u = (User) xStream.fromXML(xml);

System.out.println(u.getUserName() + ” ” + u.getPassWord() + ” ” + u.getRegisteredTime());

}

// 3. 將object類型轉換為xml類型,並寫入XML文件(其他格式也可以,比如txt文件)

public void writerXML(User user) {

try {

FileOutputStream fs = new FileOutputStream(xmlPath);

xStream.toXML(user, fs);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

// 4. 讀取XML文件,載入進相應Object類型

public void readerXML() {

User user = new User();

FileInputStream fis = null;

try {

fis = new FileInputStream(xmlPath);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

xStream.fromXML(fis, user);

// 列印對象信息

System.out.println(user.toString());

// 列印對象的屬性值

System.out.println(user.getUserName() + “-” + user.getPassWord() + “-“

+ user.getRegisteredTime());

}

public static void main(String[] args) {

// 用戶名

String username = “admin”;

// 密碼

String password = “admin”;

// 註冊時間

Date now = new Date();

SimpleDateFormat format = new SimpleDateFormat(“yyyyMMddHHmmss”);

String registeredtime = format.format(now);

User user = new User(username, password, registeredtime);

SwitchXML switchXML = new SwitchXML();

// 1. object類型轉換為xml類型,在控制台列印

String xml = switchXML.printXML(user);

System.out.println(“———————“);

// 2. xml類型轉換為object類型,在控制台列印

switchXML.printObj(xml);

System.out.println(“———————“);

// 3. 將object類型轉換為xml類型,並寫入XML文件

switchXML.writerXML(user);

System.out.println(“———————“);

// 4. 讀取XML文件,載入進相應Object類型

switchXML.readerXML();

}

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文件?

解析一個XML文件有四種方式:DOM 、JDOM、SAX 、DOM4J 。我以DOM解析方式來簡單說明下。

首先,我們先導入所需要的包:

import javax.xml.DocumentBuilderFactory; //用來創建解析器工廠

import javax.xml.DocumentBuilder; //解析器對象

import org.w3c.dom.Document; //Document類實現了W3C組織定義的介面規範。

import org.w3c.dom.NodeList; //節點列表類要導入的包,它也是W3C組織下的類。

DocumentBuilderFactory類是一個抽象類,不能直接實例化,但該類提供了一個newInstance方法,我們使用該方法先獲得一個新的實例對象factory:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

接著,我們從解析器工廠獲取解析器對象:

DocumentBuilder builder = factory.newDocumentBuilder();

這時,可以調用DocumentBuilder對象的parse方法,它會返回一個新的DOM文檔對象:

Document doc = builder.parse(「」);

這裡parse方法將給定的URI的內容當作XML文檔來分析,最後形成一個樹狀對象集合。這樣我們就可以使用doc對象來獲取文檔中的內容了。如:

NodeList list = doc.getElementsByTagName(「title」);

getElementsByTagName方法可以根據標籤名獲取元素節點集合。調用該方法並傳入標籤名「title」作為參數,能獲取到所有「title」元素的集合。

用DOM解析XML大體步驟如上,如果你還有不明白的,可以上秒秒學了解下。

java解析嵌套xml??

NodeList origNodeList = doc.getElementsByTagName(“orig”);

NodeList emNodeList = doc.getElementsByTagName(“em”);

//刪除em標籤中的內容

origNodeList.item(0).removeChild(emNodeList.item(0));

//輸出要求的句子

System.out.println(origNodeList.item(0).getTextContent());

原創文章,作者:CSUME,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/313407.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CSUME的頭像CSUME
上一篇 2025-01-07 09:43
下一篇 2025-01-07 09:43

相關推薦

  • Java JsonPath 效率優化指南

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

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

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

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

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

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 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中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

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

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

    編程 2025-04-29

發表回復

登錄後才能評論