使用Dom4j解析多层命名空间的xml
xml模板信息:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<soap:Envelope
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<soap:Body>
<CallInterfaceResponse
xmlns=\"http://tempuri.org/\">
<CallInterfaceResult>
<Response>
<ResultCode>1</ResultCode>
<ResultMsg></ResultMsg>
<Items>
<Item>
<ID>28</ID>
<PID>2000570446</PID>
<VISIT>1</VISIT>
<VISITTYPE>2</VISITTYPE>
<DZSQDH>01P202203-2500003</DZSQDH>
<SXRQSJ>2022-03-25 10:56:48</SXRQSJ>
<XDMB>5000022025695</XDMB>
<SXPZDM>BIS60</SXPZDM>
<SXL>1.50</SXL>
<SXLJLDW>U</SXLJLDW>
</Item>
<Item>
<ID>32</ID>
<PID>2000117428</PID>
<VISIT>1</VISIT>
<VISITTYPE>2</VISITTYPE>
<DZSQDH>01P202203-2500005</DZSQDH>
<SXRQSJ>2022-03-25 10:14:28</SXRQSJ>
<XDMB>5000022057327</XDMB>
<SXPZDM>BIS60</SXPZDM>
<SXL>1.50</SXL>
<SXLJLDW>U</SXLJLDW>
</Item>
</Items>
</Response>
</CallInterfaceResult>
</CallInterfaceResponse>
</soap:Body>
</soap:Envelope>
需求:获取所有Item中的内容
Java代码:
Document document = null;
try {
document = DocumentHelper.parseText(str.replaceAll("\\n", ""));
} catch (DocumentException e) {
e.printStackTrace();
}
Map<String, String> nameSpaceMap = new HashMap<>();
// 获得命名空间
String nsURI = document.getRootElement().getNamespaceURI();
nameSpaceMap.put("soap", "http://schemas.xmlsoap.org/soap/envelope/");
nameSpaceMap.put("xmlns", "http://tempuri.org/");
// 创建解析路径,就是在普通的解析路径前加上map里的key值
XPath xPath = document.createXPath("//soap:Envelope/soap:Body/xmlns:CallInterfaceResponse/xmlns:CallInterfaceResult"
+ "/xmlns:Response/xmlns:Items/xmlns:Item");
xPath.setNamespaceURIs(nameSpaceMap);
List<Element> elementList = xPath.selectNodes(document);
for (Element element : elementList) {
List<Element> list = element.elements();
for (Element element4 : list) {
System.out.println(element4.getName() + "*******" + element4.getText());
}
}
需要引入的依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.2</version>
</dependency>