如何从 XML 字符串中提取指定元素的文本值

千敏小哥_3163

千敏小哥_3163

2026-08-18

358人浏览

原创

如何从 XML 字符串中提取指定元素的文本值

本文介绍在 java 中将数据库返回的 xml 字符串解析并提取任意节点文本内容的完整方法,涵盖 xml 校验、dom 解析、命名空间处理及常见错误规避。

本文介绍在 java 中将数据库返回的 xml 字符串解析并提取任意节点文本内容的完整方法,涵盖 xml 校验、dom 解析、命名空间处理及常见错误规避。

在 Java 开发中,经常需要从数据库读取 XML 格式的字符串(如 CLOB 字段),并从中提取特定字段的文本值(例如 <id></id> 的内容)。但初学者常陷入两个误区:一是误以为“XML 作为字符串”就无需解析,直接用正则或 substring 处理;二是忽略 XML 结构合法性与命名空间问题,导致解析失败。

首先,请务必确保你的 XML 是语法正确且格式良好(well-formed) 的。你提供的示例中存在明显错误,例如:

<from>
  asfaoi232sdianscv
  <!-- ❌ 应为 </From>,标签不匹配 --></from>

此类错误会使任何标准 XML 解析器(DOM/SAX/StAX)抛出 SAXParseException。因此,在解析前建议先做基础校验——可借助在线工具或通过 DocumentBuilder 的验证模式快速检测:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false); // 不启用 DTD 验证(通常不需要)
factory.setNamespaceAware(true); // ✅ 关键!启用命名空间支持

由于你的 XML 声明了默认命名空间 xmlns="urn:iso:std:iso:20022:tech:xsd:",直接使用 getElementsByTagName("Wllt") 将无法匹配(因为 Wllt 实际属于该命名空间)。此时需采用带命名空间的查找方式。以下是推荐的完整解决方案(基于 DOM API,简洁易懂,适合业务逻辑开发):

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
import java.nio.charset.StandardCharsets;

public class XmlTextExtractor {
    public static String extractTextFromXml(String xmlString, String tagName, String namespaceUri) {
        try (InputStream is = new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8))) {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true); // 必须启用!

            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(is);
            doc.getDocumentElement().normalize();

            // 使用 XPath 是更健壮的方式(推荐)
            javax.xml.xpath.XPath xPath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
            xPath.setNamespaceContext(new NamespaceContext() {
                @Override
                public String getNamespaceURI(String prefix) {
                    return "urn:iso:std:iso:20022:tech:xsd:".equals(prefix) ? 
                           "urn:iso:std:iso:20022:tech:xsd:" : null;
                }
                @Override public String getPrefix(String uri) { return null; }
                @Override public java.util.Iterator getPrefixes(String uri) { return null; }
            });

            // 示例:提取 <wllt><id> 的文本值
            String expression = "//*[local-name()='Wllt']/*[local-name()='Id']/text()";
            String result = xPath.compile(expression).evaluate(doc).trim();
            return result.isEmpty() ? null : result;

        } catch (Exception e) {
            throw new RuntimeException("Failed to parse or extract from XML", e);
        }
    }

    // 使用示例
    public static void main(String[] args) {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<document xmlns='\"urn:iso:std:iso:20022:tech:xsd:\"'>\n" +
                "  <getwlltinf>\n" +
                "    <req>\n" +
                "      <reqcrit>\n" +
                "        <pty>\n" +
                "          <wllt>\n" +
                "            <id>sck12312-asdasd621j23-asdasdgsfg</id>\n" +
                "          </wllt>\n" +
                "        </pty>\n" +
                "      </reqcrit>\n" +
                "    </req>\n" +
                "  </getwlltinf>\n" +
                "</document>";

        String idValue = extractTextFromXml(xml, "Id", "urn:iso:std:iso:20022:tech:xsd:");
        System.out.println("Extracted ID: " + idValue); // 输出: sck12312-asdasd621j23-asdasdgsfg
    }
}</id></wllt>

✅ 关键要点总结:

  • 永远先修复 XML 合法性:标签必须严格闭合,属性引号完整,命名空间声明一致;
  • 启用 setNamespaceAware(true):否则带 xmlns 的文档无法正确查询;
  • 优先使用 XPath 而非 getElementsByTagName():XPath 支持 local-name() 等函数,能绕过命名空间前缀干扰,语义清晰且路径灵活;
  • 避免正则解析 XML:XML 嵌套、转义、空白处理复杂,正则极易出错且不可维护;
  • 资源及时关闭:使用 try-with-resources 管理 InputStream,防止内存泄漏。

如果你的应用对性能极度敏感(如每秒解析数万 XML),可考虑 StAX(XMLStreamReader)进行流式解析,但对绝大多数业务场景,DOM + XPath 组合已足够高效、安全且易于调试。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9977

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7122

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6272

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1316

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2629

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19951

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习