java解析xml文本的示例方法
作者:程序员老王wd
示例文本
<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 { // 创建文档构建器并解析 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"); // 根据 MessageName 处理请求 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 解析流程概述 在这段代码中,主要实现了从一个 XML 格式的对象(假设object存储了 XML 数据)中解析出特定元素的值,并根据解析结果进行后续处理的功能。整体流程包括以下几个关键步骤:
1.准备解析环境
首先,创建DocumentBuilderFactory实例,通过调用DocumentBuilderFactory.newInstance()方法来获取一个工厂对象,用于创建DocumentBuilder实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2.创建 DocumentBuilder 使用前面获取的工厂对象创建DocumentBuilder实例,这是实际用于解析 XML 的构建器。
DocumentBuilder builder = factory.newDocumentBuilder();
3.解析 XML 数据 将存储 XML 数据的object转换为字节流,并使用创建好的DocumentBuilder进行解析,得到代表整个XML 文档结构的Document对象。同时,对文档元素进行规范化处理(例如处理文本节点的空白等)。
Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8"))); doc.getDocumentElement().normalize();
4.提取特定元素的值
提取 MessageName 元素的值:
通过getElementsByTagName方法在解析后的Document对象中查找所有名为MessageName的元素,返回一个NodeList集合。
然后判断该集合的长度,如果大于 0,则获取第一个MessageName元素的文本内容,并存储到textContent变量中;否则,抛出一个自定义的ApiException异常,表示缺少MessageName元素。
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 元素的值(虽然代码中未完整展示对 Body 元素内容的详细处理,但获取了该元素的节点列表):
同样使用getElementsByTagName方法获取所有名为Body的元素,得到一个NodeList。
NodeList bodyList = doc.getElementsByTagName("Body");
6.提取 Body 元素下特定子元素的值(以示例中的循环处理为例):
先通过body.getElementsByTagName(“EQPID”)等类似方式获取特定子元素(如EQPID、MACHINEID、PANELID等)的第一个节点,并获取其文本内容,分别存储到对应的变量(eqpId、machineId、panelid等)中。
对于ITEM元素下的子元素ITEMID和ITEMVALUE,通过循环遍历body.getElementsByTagName(“ITEM”)得到的NodeList,判断节点类型为元素节点后,进行强制类型转换,再分别获取其文本内容存储到相应变量(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(); } }
通过以上步骤,实现了对给定 XML 数据的解析、特定元素值的提取以及基于解析结果的后续业务处理,并对可能出现的异常进行了相应的处理。
返回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 { // 创建DocumentBuilderFactory实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 创建DocumentBuilder DocumentBuilder builder = factory.newDocumentBuilder(); // 创建一个空的Document对象 Document doc = builder.newDocument(); // 创建根元素<Message> Element messageElement = doc.createElement("Message"); doc.appendChild(messageElement); // 创建<MessageName>元素并设置文本内容 Element messageNameElement = doc.createElement("MessageName"); messageNameElement.setTextContent("time_request"); messageElement.appendChild(messageNameElement); // 创建<Timestamp>元素并设置文本内容 Element timestampElement = doc.createElement("Timestamp"); timestampElement.setTextContent("20220217165432906359"); messageElement.appendChild(timestampElement); // 创建<Body>元素 Element bodyElement = doc.createElement("Body"); messageElement.appendChild(bodyElement); // 创建<EQPID>元素并设置文本内容 Element eqpidElement = doc.createElement("EQPID"); eqpidElement.setTextContent("CMMAB01-DTP01"); bodyElement.appendChild(eqpidElement); // 将Document对象转换为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); } } }
到此这篇关于java解析xml文本的示例方法的文章就介绍到这了,更多相关java解析xml内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!