|
|
http://www.dzxiaoshuo.com
今天用dom4j解析xml,使用xpath方式来选择结点,很奇怪的是,我怎么都不能获得相应的结点,而使用*则可以获取,整个一个下午,我都很郁闷,因为最近都是在做解析各种xml和html,本来就是很烦,怎一个烦字了得!
上 xml ,先
<?xml version="1.0" encoding="UTF-8" ?> <kml xmlns="http://earth.google.com/kml/2.0"><Response><name>北京市海淀区上地三街20号</name><Status><code>200</code><request>geocode</request></Status><Placemark id="p1"><address>中华人民共和国北京海淀区上地三街</address><AddressDetails Accuracy="6" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>中国</CountryName><AdministrativeArea><AdministrativeAreaName>北京市</AdministrativeAreaName><DependentLocality><DependentLocalityName>海淀区</DependentLocalityName><Thoroughfare><ThoroughfareName>上地三街</ThoroughfareName></Thoroughfare></DependentLocality></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="40.0394165" south="40.0331212" east="116.3148975" west="116.3068247" /></ExtendedData><Point><coordinates>116.3111634,40.0362765,0</coordinates></Point></Placemark></Response></kml>
最后发现问题出在根元素带有的名称空间上面,请看正确解析代码。
SAXReader saxReader = new SAXReader();Document document = null;try {Map<String, String> nameSpaceMap = new HashMap<String, String>();nameSpaceMap.put("googleMap", "http://earth.google.com/kml/2.0");saxReader.getDocumentFactory().setXPathNamespaceURIs(nameSpaceMap);document = saxReader.read(in);} catch (DocumentException e) {logger.error("InputStream parse error");e.printStackTrace();}List<Node> nodeList = document.selectNodes("/kml/googleMap:Response/googleMap:Placemark/googleMap:Point");System.out.println(nodeList.size());for (Node n : nodeList) {System.out.println(n.getName());}
从上面的代码中可以看出,在获取Document的时候,需要给DocumentFactory设置命名空间,通过设置一个Map参数完成此操作,然后寻找结点的时候,在节点前面加上命名空间也就是map中相应的key值即可!
终于搞定了 |
|