1. 程式人生 > 實用技巧 >sqlserver使用sql解析xml 欄位

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,就能解析出所有需要的欄位