Dom4j 解析含前缀与名字空间的 XML

本贴最后更新于 2873 天前,其中的信息可能已经渤澥桑田

Dom4j 解析含前缀名字空间与默认名字空间的 XML

示例 XML

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> <s:Header> <a:Action s:mustUnderstand="1">http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/Discover</a:Action> <a:MessageID>urn:uuid:748132ec-a575-4329-b01b-6171a9cf8478</a:MessageID> <a:ReplyTo> <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> </a:ReplyTo> <a:To s:mustUnderstand="1">https://host.linyiheng.cn:8004/EnrollmentServer/Discovery.svc</a:To> </s:Header> <s:Body> <Discover xmlns="http://schemas.microsoft.com/windows/management/2012/01/enrollment"> <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <EmailAddress>admin@aa</EmailAddress> <RequestVersion>1.0</RequestVersion> </request> </Discover> </s:Body> </s:Envelope>

基础知识

  1. 含前缀名字空间,和默认名字空间存在的意义在于它们用来标识 XML 元素所属 ID 及赋予该 ID 标识元素相关约束等功能。
  2. 默认名字空间所属元素下所有子元素,若未被其他前缀定义则默认识别默认名字空间为其 ID。
  3. XPath 语法:"//前缀:标签",满足前缀:标签的元素即选出。"/前缀:标签/..."即从文档根路径搜索符合条件元素。详情可见下表:
  4. 当搜索的标签属于默认名字空间,则前缀,域 HashMap 中以 xmlns 作为其 key
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

示例代码

以下代码用于从上面 XML 中取出 EmailAddress 标签中的值

package cn.linyiheng.mde; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; public class SoapXML { @org.junit.Test public void generateSoapXML() { } @org.junit.Test public void resolveSoapXML() { String requestContent=""; try { requestContent = FileUtils.readFileToString(new File("mde/discoveryRequest.xml"), "UTF-8"); } catch (IOException e2) { e2.printStackTrace(); } org.dom4j.Document doc = null; try { doc = DocumentHelper.parseText(requestContent); } catch (DocumentException e1) { e1.printStackTrace(); } Map<String, String> nsmap = new HashMap<String, String>(); System.out.println(doc.getRootElement().getNamespacePrefix()); System.out.println(doc.getRootElement().getNamespaceURI()); nsmap.put(doc.getRootElement().getNamespacePrefix(), doc.getRootElement().getNamespaceURI()); nsmap.put("xmlns", "http://schemas.microsoft.com/windows/management/2012/01/enrollment"); org.dom4j.XPath xBody=doc.createXPath("/s:Envelope/s:Body"); org.dom4j.XPath xEmailAddress=doc.createXPath("/s:Envelope/s:Body/xmlns:Discover/xmlns:request/xmlns:EmailAddress"); xBody.setNamespaceURIs(nsmap); xEmailAddress.setNamespaceURIs(nsmap); //System.out.println(xBody.selectSingleNode(doc).getStringValue()); System.out.println(xEmailAddress.selectSingleNode(doc).getStringValue()); // String nsURI = doc.getRootElement().getNamespaceURI(); /* * nsmap.put("xmlns", nsURI); org.dom4j.XPath * xMsgID=doc.createXPath("//xmlns:SyncML/xmlns:SyncHdr/xmlns:MsgID"); * xMsgID.setNamespaceURIs(nsmap); String * strMsgID=xMsgID.selectSingleNode(doc).getStringValue(); */ } }
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 150 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...