java解析xml文本的示例方法
示例文本
<Message>
<MessageName>time_request</MessageName>
<Timestamp>20220217165432906359</Timestamp>
<Body>
<EQPID>CMMAB01-DTP01</EQPID>
</Body>
</Message>
示例代碼
import org.w3c.dom.Document; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.ByteArrayInputStream;
String textContent = null;
try {
// 創(chuàng)建文檔構(gòu)建器并解析 XML 字符串
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));
doc.getDocumentElement().normalize();
// 獲取 MessageName 元素
NodeList messageNameList = doc.getElementsByTagName("MessageName");
if (messageNameList.getLength() > 0) {
textContent = messageNameList.item(0).getTextContent();
} else {
throw new ApiException(ApiException.showStr("Missing MessageName element."));
}
// 獲取 Body 元素
NodeList bodyList = doc.getElementsByTagName("Body");
// 根據(jù) MessageName 處理請(qǐng)求
return equSMTService.saveICT(textContent, bodyList);
} catch (Exception e) {
// 記錄異常并拋出 ApiException
throw new ApiException(ApiException.showStr("Error processing the request: " + e.getMessage()));
}
String eqpId = body.getElementsByTagName("EQPID").item(0).getTextContent();
String machineId = body.getElementsByTagName("MACHINEID").item(0).getTextContent();
String panelid = body.getElementsByTagName("PANELID").item(0).getTextContent();
NodeList recipeid = body.getElementsByTagName("ITEM");
for (int i = 0; i < recipeid.getLength(); i++) {
Node badeNode = recipeid.item(i);
if (badeNode.getNodeType() == Node.ELEMENT_NODE) {
Element badeElement = (Element) badeNode;
String itemid = badeElement.getElementsByTagName("ITEMID").item(0).getTextContent();
String itemvalue =badeElement.getElementsByTagName("ITEMVALUE").item(0).getTextContent();
}
}
XML 解析流程概述 在這段代碼中,主要實(shí)現(xiàn)了從一個(gè) XML 格式的對(duì)象(假設(shè)object存儲(chǔ)了 XML 數(shù)據(jù))中解析出特定元素的值,并根據(jù)解析結(jié)果進(jìn)行后續(xù)處理的功能。整體流程包括以下幾個(gè)關(guān)鍵步驟:
1.準(zhǔn)備解析環(huán)境
首先,創(chuàng)建DocumentBuilderFactory實(shí)例,通過調(diào)用DocumentBuilderFactory.newInstance()方法來獲取一個(gè)工廠對(duì)象,用于創(chuàng)建DocumentBuilder實(shí)例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2.創(chuàng)建 DocumentBuilder 使用前面獲取的工廠對(duì)象創(chuàng)建DocumentBuilder實(shí)例,這是實(shí)際用于解析 XML 的構(gòu)建器。
DocumentBuilder builder = factory.newDocumentBuilder();
3.解析 XML 數(shù)據(jù) 將存儲(chǔ) XML 數(shù)據(jù)的object轉(zhuǎn)換為字節(jié)流,并使用創(chuàng)建好的DocumentBuilder進(jìn)行解析,得到代表整個(gè)XML 文檔結(jié)構(gòu)的Document對(duì)象。同時(shí),對(duì)文檔元素進(jìn)行規(guī)范化處理(例如處理文本節(jié)點(diǎn)的空白等)。
Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));
doc.getDocumentElement().normalize();
4.提取特定元素的值
提取 MessageName 元素的值:
通過getElementsByTagName方法在解析后的Document對(duì)象中查找所有名為MessageName的元素,返回一個(gè)NodeList集合。
然后判斷該集合的長(zhǎng)度,如果大于 0,則獲取第一個(gè)MessageName元素的文本內(nèi)容,并存儲(chǔ)到textContent變量中;否則,拋出一個(gè)自定義的ApiException異常,表示缺少M(fèi)essageName元素。
NodeList messageNameList = doc.getElementsByTagName("MessageName");
if (messageNameList.getLength() > 0) {
textContent = messageNameList.item(0).getTextContent();
} else {
throw new ApiException(ApiException.showStr("Missing MessageName element."));
}
5.提取 Body 元素的值(雖然代碼中未完整展示對(duì) Body 元素內(nèi)容的詳細(xì)處理,但獲取了該元素的節(jié)點(diǎn)列表):
同樣使用getElementsByTagName方法獲取所有名為Body的元素,得到一個(gè)NodeList。
NodeList bodyList = doc.getElementsByTagName("Body");
6.提取 Body 元素下特定子元素的值(以示例中的循環(huán)處理為例):
先通過body.getElementsByTagName(“EQPID”)等類似方式獲取特定子元素(如EQPID、MACHINEID、PANELID等)的第一個(gè)節(jié)點(diǎn),并獲取其文本內(nèi)容,分別存儲(chǔ)到對(duì)應(yīng)的變量(eqpId、machineId、panelid等)中。
對(duì)于ITEM元素下的子元素ITEMID和ITEMVALUE,通過循環(huán)遍歷body.getElementsByTagName(“ITEM”)得到的NodeList,判斷節(jié)點(diǎn)類型為元素節(jié)點(diǎn)后,進(jìn)行強(qiáng)制類型轉(zhuǎn)換,再分別獲取其文本內(nèi)容存儲(chǔ)到相應(yīng)變量(itemid和itemvalue)中。
String eqpId = body.getElementsByTagName("EQPID").item(0).getTextContent();
String machineId = body.getElementsByTagName("MACHINEID").item(0).getTextContent();
String panelid = body.getElementsByTagName("PANELID").item(0).getTextContent();
NodeList recipeid = body.getElementsByTagName("ITEM");
for (int i = 0; i < recipeid.getLength(); i++) {
Node badeNode = recipeid.item(i);
if (badeNode.getNodeType() == Node.ELEMENT_NODE) {
Element badeElement = (Element) badeNode;
String itemid = badeElement.getElementsByTagName("ITEMID").item(0).getTextContent();
String itemvalue = badeElement.getElementsByTagName("ITEMVALUE").item(0).getTextContent();
}
}
通過以上步驟,實(shí)現(xiàn)了對(duì)給定 XML 數(shù)據(jù)的解析、特定元素值的提取以及基于解析結(jié)果的后續(xù)業(yè)務(wù)處理,并對(duì)可能出現(xiàn)的異常進(jìn)行了相應(yīng)的處理。
返回XML 文本信息
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;
public class XmlMessageCreator {
public static String createXmlMessage() {
try {
// 創(chuàng)建DocumentBuilderFactory實(shí)例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 創(chuàng)建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 創(chuàng)建一個(gè)空的Document對(duì)象
Document doc = builder.newDocument();
// 創(chuàng)建根元素<Message>
Element messageElement = doc.createElement("Message");
doc.appendChild(messageElement);
// 創(chuàng)建<MessageName>元素并設(shè)置文本內(nèi)容
Element messageNameElement = doc.createElement("MessageName");
messageNameElement.setTextContent("time_request");
messageElement.appendChild(messageNameElement);
// 創(chuàng)建<Timestamp>元素并設(shè)置文本內(nèi)容
Element timestampElement = doc.createElement("Timestamp");
timestampElement.setTextContent("20220217165432906359");
messageElement.appendChild(timestampElement);
// 創(chuàng)建<Body>元素
Element bodyElement = doc.createElement("Body");
messageElement.appendChild(bodyElement);
// 創(chuàng)建<EQPID>元素并設(shè)置文本內(nèi)容
Element eqpidElement = doc.createElement("EQPID");
eqpidElement.setTextContent("CMMAB01-DTP01");
bodyElement.appendChild(eqpidElement);
// 將Document對(duì)象轉(zhuǎn)換為XML字符串
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new java.io.StringWriter());
transformer.transform(source, result);
return result.getWriter().toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String xmlMessage = createXmlMessage();
if (xmlMessage!= null) {
System.out.println(xmlMessage);
}
}
}
到此這篇關(guān)于java解析xml文本的示例方法的文章就介紹到這了,更多相關(guān)java解析xml內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring利用@Validated注解實(shí)現(xiàn)參數(shù)校驗(yàn)詳解
這篇文章主要為大家詳細(xì)介紹了在?Spring?項(xiàng)目中使用?@Validated?進(jìn)行參數(shù)校驗(yàn)的方法和常見應(yīng)用場(chǎng)景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05
Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法
這篇文章主要介紹了Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法,涉及java操作Excel文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
SpringBoot CommandLineRunner的異步任務(wù)機(jī)制使用
這篇文章主要介紹了SpringBoot CommandLineRunner的異步任務(wù)機(jī)制使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java class文件格式之?dāng)?shù)據(jù)類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java class文件格式之?dāng)?shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下2017-06-06
迅速學(xué)會(huì)@ConfigurationProperties的使用操作
這篇文章主要介紹了迅速學(xué)會(huì)@ConfigurationProperties的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
java語(yǔ)言描述Redis分布式鎖的正確實(shí)現(xiàn)方式
這篇文章主要介紹了java語(yǔ)言描述Redis分布式鎖的正確實(shí)現(xiàn)方式,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12

