天天看点

【摘】使用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();


//前后代码省略
//......