You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:15:03