如何遍历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
相关产品推荐
相关产品推荐

