当数据库某一字段存储xml 信息时,我们想获取xml 中的其中的值时,可以使用两种方式获取
数据库存储格式
1,直接使用sql 查询,此种方式在mybatis 中失效,具体原因未知
SELECT TOP 1 VALUE.value('data(/root/OutPrintUrl)[1]','varchar(60)') FROM MASSUN.MASSUN.ZYYSZ_CONFIG WITH(NOLOCK) WHERE CONFIG_NAME='OutConsultations'
查询结果为:
2,使用sql 查询出整个xml 字段,后台(JAVA)解析
SELECT TOP 1 VALUE FROM MASSUN.MASSUN.ZYYSZ_CONFIG WITH(NOLOCK) WHERE CONFIG_NAME='OutConsultations'
查询出整个xml 字符串后,解析工具
public class Xml2JsonUtil { /** * * 转换一个xml格式的字符串到json格式 * * @param xml * xml格式的字符串 * @return 成功返回json 格式的字符串;失败反回null */ public static JSONObject xml2JSON(String xml) { JSONObject obj = new JSONObject(); try { InputStream is = new ByteArrayInputStream(xml.getBytes("utf-8")); SAXBuilder sb = new SAXBuilder(false); Document doc = sb.build(is); Element root = doc.getRootElement(); obj.put(root.getName(), iterateElement(root)); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 一个迭代方法 * * @param element * : org.jdom.Element * @return java.util.Map 实例 */ @SuppressWarnings({ "unchecked", "rawtypes" }) private static Map iterateElement(Element element) { List<Element> jiedian = element.getChildren(); Element et = null; Map obj = new HashMap(); List list = null; for (int i = 0; i < jiedian.size(); i++) { list = new LinkedList(); et = (Element) jiedian.get(i); if (et.getTextTrim().equals("")) { if (et.getChildren().size() == 0){ continue; } if (obj.containsKey(et.getName())) { list = (List) obj.get(et.getName()); } list.add(iterateElement(et)); obj.put(et.getName(), list); } else { if (obj.containsKey(et.getName())) { list = (List) obj.get(et.getName()); } list.add(et.getTextTrim()); obj.put(et.getName(), list); } } return obj; } }
调用方式:
Xml2JsonUtil.xml2JSON(xml).getJSONObject("root").getJSONArray("RemarkOrderId").getString(0);
xml 为解析出的xml 字符串,根据xml结构,灵活使用getJSONObject,就能解析出所有需要的字段