sqlserver使用sql解析xml 字段

当数据库某一字段存储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,就能解析出所有需要的字段
posted @ 2020-08-05 20:02  青春的西瓜  阅读(2532)  评论(0编辑  收藏  举报