当xml带有命名空间时。dom4j的处理办法
转自:http://www.cnblogs.com/patrickchen/articles/1188920.html
当你解析XML时,是否会因为命名空间的存在而不能得偿所愿呢?
<
reportxmlns
=
"
http://www.eclipse.org/birt/2005/design
"
version
=
3.2.15
"
id
=
1
"
>
< list - propertyname = cssStyleSheets " > < structure > < propertyname = fileName " > D:eport.css </ property > </ structure > </ list - property > </ report > 第一个方案.设置你的xpath的命名空间setNamespaceURIs
public
class
TransferXML{ 第二个解决方案:设置你的DocumentFactory()的命名空间 setXPathNamespaceURIs "
);
saxReader.getDocumentFactory().setXPathNamespaceURIs(map); Documentdocument = saxReader.read(file); Listtmp = document.selectNodes( " ); System. out .println(tmp.size()); } } 第三种方法:本人用的,最笨也是最通用的方法,就是不使用开发环境给你提供的一系列对象,而是用XPath语法中自带的local-name()和 namespace-uri() 指定你要使用的节点名和命名空间。 void
main(String[]args)throwsException
SAXReadersaxReader = " ); Documentdocument = saxReader.read(file); Listtmp = document.selectNodes( //*[local-name()='report'andnamespace-uri()='http://www.eclipse.org/birt/2005/design']/*[local-name()='list-property'] out .println(tmp.size()); } } 自己写的实例 cameraServerAddresses.xml
<?xml version="1.0" encoding="UTF-8"?> <addresses xmlns="http://www.example.org/cameraServerAddress" > <address> <db>r1app.nvts.co</db> <zh>美国东1</zh> <en>US-East1</en> </address> <address> <db>r2app.nvts.co</db> <zh>日本1</zh> <en>JP-1</en> </address> <address> <db>r3app.nvts.co</db> <zh>欧洲1</zh> <en>EU-1</en> </address> </addresses> 解析方法:
/** * 初始化CameraServerAddress,从xml配置文件初始化 */ @SuppressWarnings("unchecked") public void initCameraServerAddresses(){ try { Map<String,String> uris = new HashMap<String,String>(); uris.put("cameraServerAddress","http://www.example.org/cameraServerAddress"); SAXReader reader = new SAXReader(); Document root = reader.read(this.getClass().getClassLoader().getResourceAsStream("cameraServerAddresses.xml")); XPath xpath = root.createXPath("//cameraServerAddress:address"); //创建XPath xpath.setNamespaceURIs(uris); //加入NameSpace List<DefaultElement> nodes = xpath.selectNodes(root); //执行搜索 for (DefaultElement de : nodes) { de.add(new Namespace("cameraServerAddress","http://www.example.org/cameraServerAddress")); //这里也要再次加入NameSpace Node db = de.selectSingleNode("cameraServerAddress:db"); Node zh = de.selectSingleNode("cameraServerAddress:zh"); Node en = de.selectSingleNode("cameraServerAddress:en"); NVContext.cameraServerAddresses.add(new CameraServerAddress( db.getText(),zh.getText(),en.getText())); } } catch (Exception e) { log.error("初始化CameraServerAddress失败"); e.printStackTrace(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |