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 {
// 创建文档构建器并解析 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 数据)中解析出特定元素的值,并根据解析结果进行后续处理的功能。整体流程包括以下几个关键步骤:
- 准备解析环境
- 首先,创建DocumentBuilderFactory实例,通过调用DocumentBuilderFactory.newInstance()方法来获取一个工厂对象,用于创建DocumentBuilder实例。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 创建 DocumentBuilder 使用前面获取的工厂对象创建DocumentBuilder实例,这是实际用于解析 XML 的构建器。
DocumentBuilder builder = factory.newDocumentBuilder();
- 解析 XML 数据 将存储 XML 数据的object转换为字节流,并使用创建好的DocumentBuilder进行解析,得到代表整个
XML 文档结构的Document对象。同时,对文档元素进行规范化处理(例如处理文本节点的空白等)。
Document doc = builder.parse(new ByteArrayInputStream(object.getBytes("UTF-8")));
doc.getDocumentElement().normalize();
- 提取特定元素的值
提取 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."));
}
- 提取 Body 元素的值(虽然代码中未完整展示对 Body 元素内容的详细处理,但获取了该元素的节点列表):
同样使用getElementsByTagName方法获取所有名为Body的元素,得到一个NodeList。
NodeList bodyList = doc.getElementsByTagName("Body");
- 提取 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);
}
}
}