Java中如何从文本格式XML提取字段值?
处理文本格式XML提取指定字段的Java实现
文本格式的XML和XML文件本质上没有区别,核心是把字符串解析成XML文档对象后再提取字段。以下是几种适合新手的实现方式,注意你的示例XML存在标签不匹配问题(比如<From>对应</Fr>),实际使用前需要先修正XML格式,确保标签闭合正确。
方法1:使用XPath(推荐,简洁直观)
XPath可以直接定位目标节点,适合快速提取指定字段,需要注意处理XML的默认命名空间。
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; import java.io.StringReader; import javax.xml.namespace.NamespaceContext; import javax.xml.XMLConstants; import java.util.Iterator; public class XmlTextParser { public static void main(String[] args) { // 从数据库获取的XML文本(已修正标签不匹配问题) String xmlText = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<Document xmlns=\"urn:iso:std:iso:20022:tech:xsd:\">\n" + " <GetWlltInf>\n" + " <MsgHdr>\n" + " <MsgId>123125412</MsgId>\n" + " <CreDt>2022-12-28T10:37:45.363Z</CreDt>\n" + " <From>\n" + " asfaoi232sdianscv\n" + " </From>\n" + " <To>lkmalksnd71t2987hd</To>\n" + " <OperationId>a3cf7eb8-372c-4712-82bf-1a926171a701</OperationId>\n" + " </MsgHdr>\n" + " <Req>\n" + " <ReqTp>HSTR</ReqTp>\n" + " <Prd>\n" + " <FromDateTime>\n" + " 2022-12-20T16:00:00.000Z\n" + " </FromDateTime>\n" + " <ToDateTime>\n" + " 2022-12-22T00:00:00.000Z\n" + " </ToDateTime>\n" + " </Prd>\n" + " <ReqCrit>\n" + " <Pty>\n" + " <Wllt>\n" + " <Id>sck12312-asdasd621j23-asdasdgsfg</Id>\n" + " </Wllt>\n" + " </Pty>\n" + " </ReqCrit>\n" + " </Req>\n" + " </GetWlltInf>\n" + "</Document>"; try { // 初始化文档构建器,开启命名空间支持 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); // 将字符串转为InputSource,解析成Document对象 Document doc = builder.parse(new InputSource(new StringReader(xmlText))); // 初始化XPath并设置命名空间上下文 XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if ("ns".equals(prefix)) { return "urn:iso:std:iso:20022:tech:xsd:"; } return XMLConstants.NULL_NS_URI; } @Override public String getPrefix(String namespaceURI) { return null; } @Override public Iterator getPrefixes(String namespaceURI) { return null; } }); // 提取指定字段 String msgId = xpath.evaluate("/ns:Document/ns:GetWlltInf/ns:MsgHdr/ns:MsgId", doc).trim(); String operationId = xpath.evaluate("/ns:Document/ns:GetWlltInf/ns:MsgHdr/ns:OperationId", doc).trim(); String walletId = xpath.evaluate("/ns:Document/ns:GetWlltInf/ns:Req/ns:ReqCrit/ns:Pty/ns:Wllt/ns:Id", doc).trim(); // 输出结果 System.out.println("MsgId: " + msgId); System.out.println("OperationId: " + operationId); System.out.println("Wallet Id: " + walletId); } catch (Exception e) { e.printStackTrace(); } } }
方法2:使用DOM解析
DOM会把整个XML加载到内存,适合小体积XML,通过逐层遍历节点提取字段。
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.io.StringReader; import org.xml.sax.InputSource; public class DomXmlParser { public static void main(String[] args) { String xmlText = "你的XML文本字符串"; // 替换为实际XML文本 try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(xmlText))); doc.getDocumentElement().normalize(); // 提取MsgId NodeList msgIdNodes = doc.getElementsByTagNameNS("urn:iso:std:iso:20022:tech:xsd:", "MsgId"); if (msgIdNodes.getLength() > 0) { String msgId = msgIdNodes.item(0).getTextContent().trim(); System.out.println("MsgId: " + msgId); } // 提取Wallet Id NodeList walletIdNodes = doc.getElementsByTagNameNS("urn:iso:std:iso:20022:tech:xsd:", "Id"); if (walletIdNodes.getLength() > 0) { String walletId = walletIdNodes.item(0).getTextContent().trim(); System.out.println("Wallet Id: " + walletId); } } catch (Exception e) { e.printStackTrace(); } } }
方法3:使用Jackson XML(面向对象,适合固定结构XML)
如果XML结构固定,可以将其转为Java对象,直接通过对象属性获取字段值。
首先添加Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.15.2</version> </dependency>
定义对应Java实体类:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; @JacksonXmlRootElement(localName = "Document", namespace = "urn:iso:std:iso:20022:tech:xsd:") public class Document { @JacksonXmlProperty(localName = "GetWlltInf", namespace = "urn:iso:std:iso:20022:tech:xsd:") private GetWlltInf getWlltInf; public GetWlltInf getGetWlltInf() { return getWlltInf; } public void setGetWlltInf(GetWlltInf getWlltInf) { this.getWlltInf = getWlltInf; } public static class GetWlltInf { @JacksonXmlProperty(localName = "MsgHdr", namespace = "urn:iso:std:iso:20022:tech:xsd:") private MsgHdr msgHdr; @JacksonXmlProperty(localName = "Req", namespace = "urn:iso:std:iso:20022:tech:xsd:") private Req req; public MsgHdr getMsgHdr() { return msgHdr; } public void setMsgHdr(MsgHdr msgHdr) { this.msgHdr = msgHdr; } public Req getReq() { return req; } public void setReq(Req req) { this.req = req; } } public static class MsgHdr { @JacksonXmlProperty(localName = "MsgId", namespace = "urn:iso:std:iso:20022:tech:xsd:") private String msgId; @JacksonXmlProperty(localName = "OperationId", namespace = "urn:iso:std:iso:20022:tech:xsd:") private String operationId; public String getMsgId() { return msgId; } public void setMsgId(String msgId) { this.msgId = msgId; } public String getOperationId() { return operationId; } public void setOperationId(String operationId) { this.operationId = operationId; } } public static class Req { @JacksonXmlProperty(localName = "ReqCrit", namespace = "urn:iso:std:iso:20022:tech:xsd:") private ReqCrit reqCrit; public ReqCrit getReqCrit() { return reqCrit; } public void setReqCrit(ReqCrit reqCrit) { this.reqCrit = reqCrit; } } public static class ReqCrit { @JacksonXmlProperty(localName = "Pty", namespace = "urn:iso:std:iso:20022:tech:xsd:") private Pty pty; public Pty getPty() { return pty; } public void setPty(Pty pty) { this.pty = pty; } } public static class Pty { @JacksonXmlProperty(localName = "Wllt", namespace = "urn:iso:std:iso:20022:tech:xsd:") private Wllt wllt; public Wllt getWllt() { return wllt; } public void setWllt(Wllt wllt) { this.wllt = wllt; } } public static class Wllt { @JacksonXmlProperty(localName = "Id", namespace = "urn:iso:std:iso:20022:tech:xsd:") private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } }
解析代码:
import com.fasterxml.jackson.dataformat.xml.XmlMapper; public class JacksonXmlParser { public static void main(String[] args) { String xmlText = "你的XML文本字符串"; // 替换为实际XML文本 try { XmlMapper xmlMapper = new XmlMapper(); Document document = xmlMapper.readValue(xmlText, Document.class); // 提取字段 String msgId = document.getGetWlltInf().getMsgHdr().getMsgId(); String operationId = document.getGetWlltInf().getMsgHdr().getOperationId(); String walletId = document.getGetWlltInf().getReq().getReqCrit().getPty().getWllt().getId(); System.out.println("MsgId: " + msgId); System.out.println("OperationId: " + operationId); System.out.println("Wallet Id: " + walletId); } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Ruslan Fazylyanov
相关产品推荐
相关产品推荐

