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

如何遍历MySQL(longtext)/MS SQL(nvarchar(max))中Attributes列的字符串值

Java解析XML格式属性字符串获取键值对

以下提供三种可行的实现方案,可根据实际场景选择:

方法1:Java原生DOM解析(无需额外依赖)

利用JDK自带的XML解析API,直接解析XML字符串并提取<entry>标签的key和value属性:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import org.xml.sax.InputSource;

// 在ResultSet循环中处理
while (rs.next()) {
    String attributesXml = rs.getString("attributes");
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    
    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputSource inputSource = new InputSource(new StringReader(attributesXml));
        Document doc = builder.parse(inputSource);
        
        // 获取所有entry节点
        NodeList entryNodes = doc.getElementsByTagName("entry");
        
        // 遍历提取键值对
        for (int i = 0; i < entryNodes.getLength(); i++) {
            Element entryElement = (Element) entryNodes.item(i);
            String key = entryElement.getAttribute("key");
            String value = entryElement.getAttribute("value");
            
            // 此处可根据需求处理键值对,比如存入Map或打印
            System.out.printf("Key: %s, Value: %s%n", key, value);
        }
    } catch (Exception e) {
        e.printStackTrace();
        // 可添加日志记录等异常处理逻辑
    }
}

方法2:使用Jackson XML解析(代码更简洁)

通过Jackson XML库将XML直接转换为Map结构,需要先引入依赖:

Maven依赖

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.15.2</version> <!-- 使用最新稳定版 -->
</dependency>

实现代码

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.util.Map;

// 定义XML结构对应的包装类
class AttributesWrapper {
    private Map<String, String> Map;

    public Map<String, String> getMap() {
        return Map;
    }

    public void setMap(Map<String, String> map) {
        Map = map;
    }
}

// 在ResultSet循环中处理
while (rs.next()) {
    String attributesXml = rs.getString("attributes");
    XmlMapper xmlMapper = new XmlMapper();
    // 忽略未知属性,避免解析报错
    xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
    try {
        AttributesWrapper wrapper = xmlMapper.readValue(attributesXml, AttributesWrapper.class);
        // 遍历Map获取键值对
        for (Map.Entry<String, String> entry : wrapper.getMap().entrySet()) {
            System.out.printf("Key: %s, Value: %s%n", entry.getKey(), entry.getValue());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

方法3:正则表达式(不推荐生产环境使用)

若XML结构完全固定,可临时用正则匹配提取,但XML结构稍有变化(如换行、属性顺序调整)就会失效:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 在ResultSet循环中处理
while (rs.next()) {
    String attributesXml = rs.getString("attributes");
    String regex = "<entry key=\"([^\"]*)\" value=\"([^\"]*)\"/>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(attributesXml);
    
    while (matcher.find()) {
        String key = matcher.group(1);
        String value = matcher.group(2);
        System.out.printf("Key: %s, Value: %s%n", key, value);
    }
}

各方法优缺点对比

  • DOM解析:无需额外依赖,兼容性强;但内存占用较高,不适合超大XML文件。
  • Jackson XML:代码简洁,支持复杂结构转换,扩展性好;需要引入第三方依赖。
  • 正则表达式:实现快速;但容错性极低,维护成本高,仅适合临时测试场景。

内容的提问来源于stack exchange,提问作者Pramod Kumar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:05:18