工作中的坑——dom4j解析含有命名空间的XML的坑

栏目: 编程语言 · XML · 发布时间: 6年前

内容简介:虽然网上有很多类似的文章,可都描述的不是特别清楚且都是很老的文章了,让人走很多弯路,这里完整记录下。网上大多数分析的帖子都说dom4j解析xml性能最好,所以在碰到实际业务场景中就着手使用dom4j来解析xml了。在业务场景中解析xml基本上两种,一种是配置,另一种是调用外部项目接口反馈的xml。前者这里不多说,自己的配置随心所欲,通常xml的结构也相对比较简单。而后者就比较糟心了,比如我遇到的,一边接对应的接口一边不停的吐槽,泪崩中啊。

虽然网上有很多类似的文章,可都描述的不是特别清楚且都是很老的文章了,让人走很多弯路,这里完整记录下。

说在前面

网上大多数分析的帖子都说dom4j解析xml性能最好,所以在碰到实际业务场景中就着手使用dom4j来解析xml了。

在业务场景中解析xml基本上两种,一种是配置,另一种是调用外部项目接口反馈的xml。前者这里不多说,自己的配置随心所欲,通常xml的结构也相对比较简单。而后者就比较糟心了,比如我遇到的,一边接对应的接口一边不停的吐槽,泪崩中啊。

至于dom4j如何使用和一些基本概念,这里就不过多描述,网上随便一搜就是一大堆。

这里主要说下解析含有命名空间的XML。

具体实现

先看要我要解析的XML格式,如下截图,其实也不是很复杂:

工作中的坑——dom4j解析含有命名空间的XML的坑

在了解完dom4j基本概念之后,我就开始着手开发了,发现在获取完根节点之后,我需要递归几次才能获取我需要的 record 这个节点,显然比较麻烦。

于是继续google发现可以使用 selectNode(xpath) 的方式来直接获取,这个才是我想要的。

原以为几行代码轻松搞定,可最后发现 selectNode 始终获取不到对应的节点,起初还以为是我的路径有问题,后来才知道dom4j不能识别带命名空间的节点,所以在读取带命名空间的XML时,要在每个节点前加上命名空间。

好吧,我只想安安静静地解析个XML,居然这么绕,顿时心里又在吐槽这个接口本身了,非要用什么webservice返回个xml,http+json多好呀。

吐槽归吐槽,接还是得接啊,网上找些资料之后也大致明白,只要在节点前加上命名空间即可。

可好事多磨啊,我接的那个接口居然有两个命名空间, soapenvresponse 两个节点上都有,好吧,我忍。

大体思路就是,先获取根节点,取到对应的命名空间,然后selectSingleNode到 response 这个节点取第二个命名空间,最后再组装xpath取到自己想要的节点。核心代码如下:

Document doc = XmlUtil.strToDocument(responseStr);

Map map = new HashMap();
// 获得命名空间
String firstUrl = doc.getRootElement().getNamespaceURI();
map.put("firstUrl", firstUrl);

XPath x = doc.createXPath("//firstUrl:Body");
x.setNamespaceURIs(map);
//获取第二层xml的命名空间
String secendUrl = ((Element) x.selectSingleNode(doc)).element("response").getNamespaceURI();

map.put("secendUrl", secendUrl);

x = doc.createXPath("//firstUrl:Body/secendUrl:response/"
        + "secendUrl:responseBody/secendUrl:records/secendUrl:record");
x.setNamespaceURIs(map);

List<Element> nodes = x.selectNodes(doc);

说在后面

在开发一段时间的 java 之后,突然开始怀念起 .net了,尤其在处理一些细节方面的时候,总感觉java有点啰嗦,明明可以一行代码搞定的事情,需要写个三四行。

java10终于支持var关键字了,java11要开始收费了,不懂是福还是祸啊~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

中国游戏风云

中国游戏风云

王亚晖 / 中国发展出版社 / 2018-11-1 / 168.00元

本书以时间为序,介绍了整个游戏产业发展的跌宕起伏。分别讲述了早期游戏市场、单机游戏、网络游戏、网页游戏和手机游戏以及未来游戏世界。作者本人曾为知名游戏产业人,书中披露了大量不为大众所知的行业故事和行业数据。为游戏的制作者、投资人、玩家,抑或想了解游戏的人,提供了一个理性的梳理。一起来看看 《中国游戏风云》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具