1. 程式人生 > >dom4j 對含有名稱空間的xml進行解析

dom4j 對含有名稱空間的xml進行解析

待解析xml報文

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns1:queryBalanceBonResponse xmlns:ns1="http://chinasoftinc.com/BonWebservice/">
         <result>0</result>
         <errorCode>0</errorCode>
         <errorMessage
>
查詢餘額成功</errorMessage> <paymentFlag>0</paymentFlag> <totalBalanceAvailable>20</totalBalanceAvailable> <balanceDetail> <balanceInfo> <balanceTypeFlag>0</balanceTypeFlag> <BalanceAvailable
>
20</BalanceAvailable> </balanceInfo> <balanceInfo> <balanceTypeFlag>1</balanceTypeFlag> <BalanceAvailable>0</BalanceAvailable> </balanceInfo> </balanceDetail> </ns1:queryBalanceBonResponse
>
</soapenv:Body> </soapenv:Envelope>

報文對應的bean
QueryModel .java

package cn.com.min.dom4j;

import java.util.ArrayList;
import java.util.List;

public class QueryModel {
    private String  result ="";
    private String  errorCode ="";
    private String  errorMessage ="";
    private String  paymentFlag ="";
    private String  totalBalanceAvailable ="";
    private List<BalanceInfoListModel> balanceInfos =new ArrayList<BalanceInfoListModel>();
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
    public String getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }
    public String getErrorMessage() {
        return errorMessage;
    }
    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }
    public String getPaymentFlag() {
        return paymentFlag;
    }
    public void setPaymentFlag(String paymentFlag) {
        this.paymentFlag = paymentFlag;
    }
    public String getTotalBalanceAvailable() {
        return totalBalanceAvailable;
    }
    public void setTotalBalanceAvailable(String totalBalanceAvailable) {
        this.totalBalanceAvailable = totalBalanceAvailable;
    }
    public List<BalanceInfoListModel> getBalanceInfos() {
        return balanceInfos;
    }
    public void setBalanceInfos(List<BalanceInfoListModel> balanceInfos) {
        this.balanceInfos = balanceInfos;
    }




}

BalanceInfoListModel.java

package cn.com.min.dom4j;

public class BalanceInfoListModel {
    private String balanceTypeFlag = "";
    private String BalanceAvailable = "";
    public String getBalanceTypeFlag() {
        return balanceTypeFlag;
    }
    public void setBalanceTypeFlag(String balanceTypeFlag) {
        this.balanceTypeFlag = balanceTypeFlag;
    }
    public String getBalanceAvailable() {
        return BalanceAvailable;
    }
    public void setBalanceAvailable(String balanceAvailable) {
        BalanceAvailable = balanceAvailable;
    }



}

解析類
XML2Bean.java

package cn.com.min.dom4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.*;
import org.dom4j.io.SAXReader;

public class XML2Bean {

    public static String getNotNullNodeValue(Node n) {
        return getNotNullNodeValue(n, null);
    }

    public static String getNotNullNodeValue(Node n, String valueType) {
        if (n == null)
            return "";
        else
            return n.getStringValue().trim();
    }

    public static QueryModel xmlToQueryModel(String xml) throws DocumentException{ //異常直接丟擲去了
        Map map = new HashMap();
        Document doc = DocumentHelper.parseText(xml);
        QueryModel queryModel =new QueryModel();
        Element rootElrm= doc.getRootElement();
       // map.put("soapenv","http://schemas.xmlsoap.org/soap/envelope/");
       // map.put("ns1","http://chinasoftinc.com/BonWebservice/");
        Element el = rootElrm.element("Body");
        Element node = el.element("queryBalanceBonResponse");
        System.out.println(node.asXML());
       // XPath x = doc.createXPath("//soapenv:Body/ns1:queryBalanceBonResponse");
      //  x.setNamespaceURIs(map);
      //  List nodelist = x.selectNodes(doc);
      //  Node node = (Node) nodelist.get(0);
        //System.out.println(node.asXML());
        //queryModel.setErrorCode(XML2Bean.getNotNullNodeValue(node.selectSingleNode("result")));
        //System.out.println(node.selectSingleNode("result").getText());

        queryModel.setResult(XML2Bean.getNotNullNodeValue(node.selectSingleNode("errorCode")));
        queryModel.setErrorMessage(XML2Bean.getNotNullNodeValue(node.selectSingleNode("errorMessage")));
        queryModel.setPaymentFlag(XML2Bean.getNotNullNodeValue(node.selectSingleNode("paymentFlag")));
        queryModel.setTotalBalanceAvailable(XML2Bean.getNotNullNodeValue(node.selectSingleNode("totalBalanceAvailable")));

        List<Node> nodes = node.selectNodes("balanceDetail/balanceInfo");

        if (nodes != null && nodes.size()>0) {
            List<BalanceInfoListModel> balanceInfos =new ArrayList<BalanceInfoListModel>();
            for(Node nod :nodes){

                BalanceInfoListModel  balanceInfoListModel = new BalanceInfoListModel();
                balanceInfoListModel.setBalanceTypeFlag(XML2Bean.getNotNullNodeValue(nod.selectSingleNode("balanceTypeFlag")));
                balanceInfoListModel.setBalanceAvailable(XML2Bean.getNotNullNodeValue(nod.selectSingleNode("BalanceAvailable")));
                System.out.println("-->"+XML2Bean.getNotNullNodeValue(nod.selectSingleNode("BalanceAvailable")));
                System.out.println("-->"+nod.selectSingleNode("balanceTypeFlag").getText());
                balanceInfos.add(balanceInfoListModel);
            }
            queryModel.setBalanceInfos(balanceInfos);               
        }   
        return queryModel;
    }

    public static void main(String[] args) {
        String xml1 ="<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'><soapenv:Body><ns1:queryBalanceBonResponse xmlns:ns1='http://chinasoftinc.com/BonWebservice/'><result>0</result><errorCode>0</errorCode><errorMessage>查詢餘額成功</errorMessage><paymentFlag>0</paymentFlag><totalBalanceAvailable>20</totalBalanceAvailable><balanceDetail><balanceInfo><balanceTypeFlag>0</balanceTypeFlag><BalanceAvailable>200</BalanceAvailable></balanceInfo><balanceInfo><balanceTypeFlag>1</balanceTypeFlag><BalanceAvailable>0</BalanceAvailable></balanceInfo></balanceDetail></ns1:queryBalanceBonResponse></soapenv:Body></soapenv:Envelope>";

        try {
            QueryModel queryModel = XML2Bean.xmlToQueryModel(xml1);
            System.out.println(queryModel.getErrorCode());
        } catch (DocumentException e) {
            System.out.println(e);
        }
    }

}

以上原始碼可直接使用

其中主要的解析方法 public static QueryModelxmlToQueryModel(String xml)

其中使用兩種方式進行含名稱空間的xml進行解析

public static QueryModel xmlToQueryModel(String xml) throws DocumentException{ //異常直接丟擲去了
        Document doc = DocumentHelper.parseText(xml);
        QueryModel queryModel =new QueryModel();
        Element rootElrm= doc.getRootElement();

        Element el = rootElrm.element("Body");
        Element node = el.element("queryBalanceBonResponse");
        System.out.println(node.asXML());

queryModel.setErrorCode(XML2Bean.getNotNullNodeValue(node.selectSingleNode("result"))); 

queryModel.setResult(XML2Bean.getNotNullNodeValue(node.selectSingleNode("errorCode")));
        queryModel.setErrorMessage(XML2Bean.getNotNullNodeValue(node.selectSingleNode("errorMessage")));
        queryModel.setPaymentFlag(XML2Bean.getNotNullNodeValue(node.selectSingleNode("paymentFlag")));
        queryModel.setTotalBalanceAvailable(XML2Bean.getNotNullNodeValue(node.selectSingleNode("totalBalanceAvailable")));

        List<Node> nodes = node.selectNodes("balanceDetail/balanceInfo");

        if (nodes != null && nodes.size()>0) {
            List<BalanceInfoListModel> balanceInfos =new ArrayList<BalanceInfoListModel>();
            for(Node nod :nodes){

                BalanceInfoListModel  balanceInfoListModel = new BalanceInfoListModel();
                balanceInfoListModel.setBalanceTypeFlag(XML2Bean.getNotNullNodeValue(nod.selectSingleNode("balanceTypeFlag")));
                balanceInfoListModel.setBalanceAvailable(XML2Bean.getNotNullNodeValue(nod.selectSingleNode("BalanceAvailable")));
                System.out.println("-->"+XML2Bean.getNotNullNodeValue(nod.selectSingleNode("BalanceAvailable")));
                System.out.println("-->"+nod.selectSingleNode("balanceTypeFlag").getText());
                balanceInfos.add(balanceInfoListModel);
            }
            queryModel.setBalanceInfos(balanceInfos);               
        }   
        return queryModel;
    }
public static QueryModel xmlToQueryModel(String xml) throws DocumentException{ //異常直接丟擲去了
        Map map = new HashMap();
        Document doc = DocumentHelper.parseText(xml);
        QueryModel queryModel =new QueryModel();
        Element rootElrm= doc.getRootElement();
        map.put("soapenv","http://schemas.xmlsoap.org/soap/envelope/");
        map.put("ns1","http://chinasoftinc.com/BonWebservice/");
        XPath x = doc.createXPath("//soapenv:Body/ns1:queryBalanceBonResponse");
        x.setNamespaceURIs(map);
        List nodelist = x.selectNodes(doc);
        Node node = (Node) nodelist.get(0);
        queryModel.setErrorCode(XML2Bean.getNotNullNodeValue(node.selectSingleNode("result")));

        queryModel.setResult(XML2Bean.getNotNullNodeValue(node.selectSingleNode("errorCode")));
        queryModel.setErrorMessage(XML2Bean.getNotNullNodeValue(node.selectSingleNode("errorMessage")));
        queryModel.setPaymentFlag(XML2Bean.getNotNullNodeValue(node.selectSingleNode("paymentFlag")));
        queryModel.setTotalBalanceAvailable(XML2Bean.getNotNullNodeValue(node.selectSingleNode("totalBalanceAvailable")));

        List<Node> nodes = node.selectNodes("balanceDetail/balanceInfo");

        if (nodes != null && nodes.size()>0) {
            List<BalanceInfoListModel> balanceInfos =new ArrayList<BalanceInfoListModel>();
            for(Node nod :nodes){

                BalanceInfoListModel  balanceInfoListModel = new BalanceInfoListModel();
                balanceInfoListModel.setBalanceTypeFlag(XML2Bean.getNotNullNodeValue(nod.selectSingleNode("balanceTypeFlag")));
                balanceInfoListModel.setBalanceAvailable(XML2Bean.getNotNullNodeValue(nod.selectSingleNode("BalanceAvailable")));
                System.out.println("-->"+XML2Bean.getNotNullNodeValue(nod.selectSingleNode("BalanceAvailable")));
                System.out.println("-->"+nod.selectSingleNode("balanceTypeFlag").getText());
                balanceInfos.add(balanceInfoListModel);
            }
            queryModel.setBalanceInfos(balanceInfos);               
        }   
        return queryModel;
    }

其中主要用的用到兩個java包
dom4j-1.6.1.jar
jaxen-1.1.1.jar

相關推薦

dom4j 含有名稱空間xml進行解析

待解析xml報文 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <

[MyBatis] Mapper.xml中的名稱空間及命名解析

Mapper.xml相關使用 名稱空間(Namespaces) 名稱空間(Namespaces) 在之前版本的MyBatis中是可選的,這樣容易引起混淆因此毫無益處。現在名稱空間則是必須的,且易於簡單地用更長的完完全限定名來隔離語句。 名稱空間使得你所見到的介面繫結成為可能,

dom4j結合xpath獲取多名稱空間xml中指定id、指定屬性節點

在上一篇中提到,如果xml文件中有namespace的情況,如果沒有手動設定namespace的話,是獲取不到節點資料的。那麼要怎麼獲取多個namesapce的xml文件中,指定的id的指定名稱的屬性。 具體情況如下 : spring配置檔案下有多個名稱空間

html--URL傳參數進行解析

-- earch com turn indexof repl span 需要 lac 跳轉頁面需要傳參數到另外一個html頁面,跳轉鏈接可寫一個js的function function doView(articleId) { window.location.hre

面向名稱空間和組合

類之間的關系 dbo 實現 area home python ice end style 類名稱空間與對象的名稱空間 創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字稱為類的屬性 而類有兩種屬性:靜態屬性和動態屬性 靜態屬性就是直接在類

DOM,SAX,JDOM,DOM4J優缺點比較及生產xml解析xml

下載必要的jar包: activation.jar commons-logging-1.0.4.jar dom4j-1.6.1.jar jaxen-1.1.1.jar jdom-1.0.jar 一、DOM 解析器讀入整個文件,然後構建一個駐留記憶體的樹結構,使用 DOM 介

利用DateFormat、Date、Calendar等類 含有時間的字串進行提取和計算

在時間提取方面我用了三種方法,最開始使用的是正則表示式,很簡潔, 之後使用的是Date類中的方法,但這種方法都已過時, 最後使用的是Calendar類的方法。、 我推薦使用正則表示式,簡潔實用; package cn.hanfeng.example13_6; imp

iOS kml檔案內資料進行解析並在地圖上繪製(二)

這是我寫好的demo, 有解析工具和資料解析的思路. 提供一個參考! kml檔案其中的一種格式, 如下展示的 <Placemark> <name>001&

型別配置名稱空間 —— XML schema

對於基於 XML 的配置,Spring 2.0 以後告別 DTD 格式(Document Type Definition)的配置檔案,開始採用 Schema 格式,Schema 的突出亮點即是可讓不同型別的配置擁有自己的名稱空間(namespace),使得配置檔

PHP名稱空間的理解

    最早的PHP是沒有名稱空間的,所有PHP程式碼存在同一個名稱空間之下,這樣的話就不能存在相同的類或者相同的函式。但是當我們的工程越來越大的時候,由此產生的衝突會越來越多。     PHP5.3之後增加了對名稱空間的支援,宣告名稱空間名使用namespace+名稱

dom4j解析xml基本方法以及當xml中存在名稱空間時的三種處理辦法

使用SAXReader需要匯入dom4j-full.jar包。      dom4j是一個Java的XML API,類似於jdom,用來讀寫XML檔案的。dom4j是一個非常非常優秀的Java XML API,具有效能優異、功能強大和極端易用使用的特點,同時它也是一個開放原始碼的軟體,可以在SourceFo

Dom4j解析帶有名稱空間XML檔案

    今天我在解析KML檔案的過程中,使用XPath表示式,可是返回的結果總是null,糾結了很久,後來通過查資料,發現是我的KML中有名稱空間的緣故。     首先,說明一些什麼是KML,因為下面的例子中會用到KML。KML是Keyhole Markup Languag

使用pull方式和sax方式xml文件進行解析

tostring 需要 nts tag .com version thp response pri 這是我自己設置的xml文件 用一下方式獲取它的內容 try{ OkHttpClient client = new OkHttpClient(); Request

XML解析】(1)Java下使用JAXP中的DOM解析方式XML文件進行解析

關於JAXP、DOM、SAX: 何為JAXP? JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API。 JAXP中分為三種解析方式: DOM解析、SAX解析、StAX

使用dom4jxml檔案進行讀取和輸出操作

1.xml檔案的讀取     讀取xml檔案的方式有兩種,一種是面向模型的DOM方式,一種是面向事件的SAX方式     DOM方式原理:一次性的將xml文件加入記憶體,在記憶體中形成一顆dom樹,然後通過語言對樹的節點進行操作。    顯然這種操作查詢元素快,但

java 使用DOM4JXML檔案進行增刪改查操作

原始碼: DOM4j.java package com.zc.homeWork19; import java.io.FileWriter; import java.util.ArrayList; import java.util.Iterator; i

dom4j 為生成 XML 的檔案新增 xmlns(名稱空間) 屬性

    今天在開發sitemap地圖時遇到一個小小問題,就是xmlns屬性的新增!我們知道sitmap 根結點有一些屬性!大體如下: <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:x

xml中存在名稱空間,三種處理辦法(dom4j

{         Map map  = new  HashMap();         map.put( " design " , " http://www.eclipse.org/birt/2005/design " );         SAXReader saxReader  = new  SAX

DOM與DOM4JXML檔案的解析

package com.freshbin.domtest.test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.Docum

使用Dom4jXML文檔創建與解析

body 設置 文檔 lazy write cat equal parse 進行 創建XML文件: public class Dom4jCreateXml { public void testCreatXml() { //創建文檔對象