Xpath解析解析出XML的一部分

前言:基于之前的一篇利用Digester解析XMl格式的文章(http://happywayq.com/Digester%E8%A7%A3%E6%9E%90XML/)我们请求之后得到的xml格式都是正常的,然而这次请求的到里面有一部分是转义之后的内容。现在我们需要解析的话,就需要把这部分转义的转回正常状态,才开始解析!

1.准备工作

导入包:dom4j-1.6.1.jar

如果是maven工程的话,在pom里面添加如下依赖:

1
2
3
4
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>

2.假设3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:queryResourceAbilityResponse xmlns:ns1="http://impl.service.baozhang112.intf.telement.com/">
<ns1:return>
&lt;responsedata&gt;
&lt;errorCode&gt;0&lt;/errorCode&gt;
&lt;errorMessage&gt;&lt;/errorMessage&gt;
&lt;resultSet class=&quot;java.util.ArrayList&quot;&gt;
&lt;result&gt;
&lt;is_maxspeed&gt;100M&lt;/is_maxspeed&gt;
&lt;/result&gt;
&lt;/resultSet&gt;
&lt;/responsedata&gt;
</ns1:return>
</ns1:queryResourceAbilityResponse>
</soap:Body>
</soap:Envelope>

我们接下来就要把中间转义的部分转成正常的xml格式,然后才进行解析

3.开始解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
String Str= "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+"<soap:Body>"
+"<ns1:queryResourceAbilityResponse xmlns:ns1=\"http://impl.service.baozhang112.intf.telement.com/\">"
+"<ns1:return>"
+"&lt;responsedata&gt;"
+"&lt;errorCode&gt;"+0+"&lt;/errorCode&gt;"
+"&lt;errorMessage&gt;"+1+"&lt;/errorMessage&gt;"
+"&lt;resultSet class=&quot;java.util.ArrayList&quot;&gt;"
+"&lt;result&gt;"
+"&lt;is_maxspeed&gt;"+is_maxspeed+"&lt;/is_maxspeed&gt;"
+"&lt;/result&gt;"
+"&lt;/resultSet&gt;"
+"&lt;/responsedata&gt;"
+"</ns1:return>"
+"</ns1:queryResourceAbilityResponse>"
+ "</soap:Body>"
+" </soap:Envelope>";
String responsedataXml = "";
try {
//将这个文档转成dom树,这样他就有自己的节点了
org.dom4j.Document ment = DocumentHelper.parseText(Str);
//找到这个结点,如果有多个,得到的是一个list
DefaultXPath xpath = new DefaultXPath("//ns1:return");//不管这个节点在什么位置。直接找到 //的作用
//给这个得到的节点内容添加命名空间。命名空间是从得到文件中找,都是自己定义的。一个xml文档肯定有自己的命名空间
xpath.setNamespaceURIs(Collections.singletonMap("ns1", "http://impl.service.baozhang112.intf.telement.com/"));
//这里如果ns1:return 有多个,那么得到就是多个
List<Element> selectNodes = xpath.selectNodes(ment);
for (Element element : selectNodes) {
responsedataXml=element.getText();//得到ns1:return里面的内容
System.out.println("responsedataXml="+element.getText());//输出结果
}
} catch (Exception e) {
}

这样就把里面部分的转义文件解析出来了,并且也已经转义好了。

输出转义之后的结果是:

1
2
3
4
5
6
7
8
9
10
responsedataXml=
<responsedata>
<errorCode>0</errorCode>
<errorMessage>1</errorMessage>
<resultSet class="java.util.ArrayList">
<result>
<is_maxspeed>100M</is_maxspeed>
</result>
</resultSet>
</responsedata>

4.我们再把我们转义之后的拼接进去本来的XMl文件里面,再进行我们接下来的解析。

坚持原创技术分享,您的支持将鼓励我继续创作!

分享
Fork me on GitHub