dom4j解析SOAP型xml文件命名空间问题

J2EE 码拜 10年前 (2015-04-02) 2289次浏览 0个评论
 

po.xml:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<SOAP-ENV:Body>
		<ns1:LST_SBRResponse xmlns:ns1="http://www.xxx.com/a/">
			<ns1:Result>
				<ns1:ResultCode>0</ns1:ResultCode>
				<ns1:ResultDesc>Operation succeeded.</ns1:ResultDesc>
				<ns1:ResultData>
					<ns1:Table1>
						<ns1:Item>
							<ns1:GRPIDX>65535</ns1:GRPIDX>
							<ns1:SCADDRIDX>65535</ns1:SCADDRIDX>
							<ns1:CDNOCB>0</ns1:CDNOCB>
							<ns1:PBTSBR>
								<ns1:PBXID />
								<ns1:ISPILOT>0</ns1:ISPILOT>
								<ns1:ISSHARESRV>0</ns1:ISSHARESRV>
							</ns1:PBTSBR>
							<ns1:KVALUE>255</ns1:KVALUE>
							<ns1:INPFIDX>65535</ns1:INPFIDX>
						</ns1:Item>
					</ns1:Table1>
				</ns1:ResultData>
			</ns1:Result>
		</ns1:LST_SBRResponse>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想取出<ns1:Item>中所有元素
java:

SAXReader saxReader = new SAXReader();  
	    Document document = saxReader.read(test.class.getResourceAsStream("po.xml"));  
	    DefaultXPath xpath = new DefaultXPath("//ns1:Item");
	    xpath.setNamespaceURIs(Collections.singletonMap("ns1","http://www.xxx.com/a/"));  
		List list = xpath.selectNodes(document);  
		Iterator iterator = list.iterator();  
		int i = 1;
        while (iterator.hasNext()) {  
            Element node = (Element) iterator.next();
            System.out.println(i++ + node.getName());  
        }

可是出来的只有Item 
请教如何解决?

dom4j解析SOAP型xml文件命名空间问题
import java.util.Collections;  
import java.util.Iterator;  
import java.util.List;  
  
import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.io.SAXReader;  
import org.dom4j.xpath.DefaultXPath;  

引入的包

dom4j解析SOAP型xml文件命名空间问题
100分
你这个没有问题。只是得到的只是<ns1:Item>结点,得到它下面的,再往下写一步就得到了。

 while (iterator.hasNext()) {  
            Element node = (Element) iterator.next();
            System.out.println(i++ + node.getName());
            List<Element> eleList = node.elements();//即是Item下的所有子结点
        }
dom4j解析SOAP型xml文件命名空间问题
 while (iterator.hasNext()) {  
            Element node = (Element) iterator.next();
            System.out.println(i++ + node.getName());
            
                           //即是Item下的所有子结点
            List<Element> eleList = node.elements();
        }

之后,到了<ns1:PBTSBR>结点,再用elements()方法得到它下面的所有子结点即可。

dom4j解析SOAP型xml文件命名空间问题
还有个问题 不知道您能否帮我解答:
下面的子节点取出来后 会有org.dom4j.tree.DefaultText  org.dom4j.tree.DefaultElement
2种DefaultElement是我想要的元素
DefaultText 是里面的空格
我不想用反射判断类型 有没trim之类的好方法直接去掉这些
dom4j解析SOAP型xml文件命名空间问题
帮我的去看下是什么原因啊。。。。。
http://topic.csdn.net/u/20120712/09/7fb59f4c-5bf0-4ded-8106-f40daba71be4.html?seed=1506720161&r=79101440#r_79101440
dom4j解析SOAP型xml文件命名空间问题
引用 6 楼  的回复:

还有个问题 不知道您能否帮我解答:
下面的子节点取出来后 会有org.dom4j.tree.DefaultText  org.dom4j.tree.DefaultElement
2种DefaultElement是我想要的元素
DefaultText 是里面的空格
我不想用反射判断类型 有没trim之类的好方法直接去掉这些

这个原因是由于我取出LIST的方法是.content()
您的elements()比这个好。哈哈哈

dom4j解析SOAP型xml文件命名空间问题
http://download.csdn.net/detail/brave2002honest/8546553

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明dom4j解析SOAP型xml文件命名空间问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!