天天看點

【摘】使用dom4j解析帶有命名空間的XML

原文連結:https://www.iteye.com/blog/jackiee-cn-2087261

在使用dom4j解析xml時,遇到xml内容中同時帶有自定義命名空間和預設命名空間的問題,百思不得其解,直到拜讀了上面連結的文章,問題終于得以解決,特此發文希望也可以幫助到有同樣疑惑的同學。

xml内容如下:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<soap:Body>
		<ExecuteResponse xmlns="http://www.anwr.cn/">
			<ExecuteResult>true</ExecuteResult>
			<errormsg>未知的錯誤。</errormsg>
			<retxml>		
				<?xml version="1.0" standalone="yes"?>  
				<DATAPACKET Version="2.0">
					<METADATA>
						<FIELDS>
							<FIELD attrname="RPTCOD" fieldtype="string" WIDTH="51"/>
							<FIELD attrname="ISXEGBT" fieldtype="boolean"/>
						</FIELDS>
						<PARAMS/>
					</METADATA>
					<ROWDATA>
						<ROW RPTCOD="20191668" ISXEGBT="FALSE"/>
						<ROW RPTCOD="20191668" ISXEGBT="TRUE"/>
						<ROW RPTCOD="N20190121" ISXEGBT="TRUE"/>
					</ROWDATA>
				</DATAPACKET>
			</retxml>
		</ExecuteResponse>
	</soap:Body>
</soap:Envelope>
           

這段xml本身應該為SOAP封包,但是因為服務釋出方的原因,無法使用ws用戶端代碼直接通路,隻能以HTTP方式通路wsdl,擷取SOAP封包之後,要二次解析才能擷取到ws接口的傳回值,即<retxml>元素内容。單純以普通xml來看,此xml有兩個命名空間,并且我要擷取的<retxml>元素使用的是預設命名空間。

解析<retxml>元素的代碼如下:

//前後代碼省略
//......

SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new ByteArrayInputStream(xml.getBytes()));
        
//字首——命名空間映射
Map map = new HashMap();
map.put("myPre", "http://www.anwr.cn/");
XPath xPath = doc.createXPath("//myPre:retxml");
xPath.setNamespaceURIs(map);
        
Node node = xPath.selectSingleNode(doc);
String text = node.getText();


//前後代碼省略
//......