有关解析XML的问题
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.163.com" xmlns:xsi="www.sohu.com" xmlns:xsd="www.sina.com">
<soap:Body>
<emailComResponse mlns="www.qq.com">
<emailComResult>
<emailResponse>
<emailNum>50000</emailNum>
<emailResult>1000</emailResult>
</emailResponse>
</emailComResult>
</emailComResponse>
</soap:Body>
</soap:Envelope>
假如上面一段xml,我想要取<emailNum>50000</emailNum>和<emailResult>1000</emailResult>这两个值,应该怎样取?
用Dom4J的话试过了,就是取不到,请高手指教。
[解决办法]
如果你的格式就是按你说的这样只想取得emailNum和emailResult
可以用Xpath来取得 需要用到jaxen-1.1-beta-6.jar包 就在dom4j的lib目录下
将jar放到项目的lib中就可以了
SAXReader sr = new SAXReader();
Document doc = sr.read(xml文件);
//取得所有父节点为emailResponse的emailNum元素(根据你提供的xml文件,就一个)
Element ele = (Element)doc.selectObject("//emailResponse/emailNum");
再通过ele.getText()就可以取得元素中的值了。这个最简单了,定位快
[解决办法]
是因为<soap:Envelope xmlns 命名空间的问题吧
Element cnml//带有命名空间的节点,也就是你的soap:Envelope节点
- Java code
HashMap<String, String> xmlMap = new HashMap<String, String>();xmlMap.put("nameSpace", cnml.getNamespaceURI());reader.getDocumentFactory().setXPathNamespaceURIs(xmlMap)
[解决办法]
- Java code
package com.util.utils;import java.io.File;import java.io.StringReader;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * 此工具类适用于生成xml报文及读取xml报文 * @author danly.feng * @category XML * @since 2012-07-25 */@SuppressWarnings("unchecked")public class XMLUtil { /** * 获取xml根 * @param xmlFile xml文件 * @return */ public static Element getXMLRoot(File xmlFile) { Element root = null; if(xmlFile != null) { Document doc; try { SAXReader reader = new SAXReader(); doc = reader.read(xmlFile); root = doc.getRootElement(); } catch (Exception e) { e.printStackTrace(); } } return root; } /** * 获取xml根 * @param xmlStr xml格式的字符串 * @return */ private static Element getXMLRoot(String xmlContent) { Element root = null; if (xmlContent != null) { SAXReader reader = new SAXReader(); Document doc; try { doc = reader.read(new StringReader(xmlContent)); root = doc.getRootElement(); } catch (Exception e) { e.printStackTrace(); } } return root; } /** * 取得xml文件的根节点名称 * @param * @return * @throws Exception */ public static String getRootName(Object obj, String defaultName) throws Exception { Element root = null; if(obj != null) { if(obj instanceof File) { root = getXMLRoot((File) obj); } else if(obj instanceof String) { root = getXMLRoot((String) obj); } } String rootName = root == null ? defaultName : root.getName(); return rootName; } /** * 返回根节点以下所有有value的节点 * @param xmlDoc xml文本 * @return Map */ public static Map<String, String> parseXmlToMap(Element root) { Map<String, String> xmlMap = null; try { if (root != null) { xmlMap = new HashMap<String, String>(); getXMLMap(root, xmlMap); } } catch (Exception e) { e.printStackTrace(); } return xmlMap; } /** * * @param element xml根节点 * @param xmlMap key为xml节点名,value为xml节点值 */ private static void getXMLMap(Element element,Map<String, String> xmlMap) { List elements = element.elements(); if(!elements.isEmpty()) { for (Object obj : elements) { Element elem = (Element) obj; getXMLMap(elem, xmlMap); } } else { xmlMap.put(parseText2Key(element.getPath()), element.getTextTrim()); } } private static String parseText2Key(String pathText) { String keyText = ""; String[] strs = pathText.split("/"); for(int i = 0; i < strs.length; i ++) { String str = strs[i]; if(!str.equals("")) { if(i != strs.length - 1) keyText += str + "."; else keyText += str; } } return keyText; } public static String map2XmlStr(Map<String, Object> xmlMap, String rootName, String encoding) { String xmlStr = "<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>"; StringBuffer sb = new StringBuffer(xmlStr); map2XmlStr(xmlMap, sb); return sb.toString(); } private static void map2XmlStr(Map<String, Object> xmlMap, StringBuffer sb) { Iterator it = xmlMap.entrySet().iterator(); while(it.hasNext()) { Entry<String, Object> entry = (Entry<String, Object>) it.next(); String key = entry.getKey(); Object value = entry.getValue(); if(value instanceof Map) { sb.append("<" + key + ">"); map2XmlStr((Map)value, sb); sb.append("</" + key + ">"); } else { sb.append("<" + key + ">"); sb.append(value); sb.append("</" + key + ">"); } } } public static void main(String[] args) { //String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><person><name>某人</name><adds><add><BS>10002</BS><note>西安市太白路</note></add></adds></person>"; String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soap:Envelope xmlns:soap=\"http://www.163.com\" xmlns:xsi=\"www.sohu.com\" xmlns:xsd=\"www.sina.com\"><soap:Body><emailComResponse mlns=\"www.qq.com\"><emailComResult><emailResponse><emailNum>50000</emailNum><emailResult>1000</emailResult></emailResponse></emailComResult></emailComResponse></soap:Body></soap:Envelope>"; Element root = getXMLRoot(xmlContent); System.out.println(parseXmlToMap(root).get("soap:Envelope.soap:Body.emailComResponse.emailComResult.emailResponse.emailNum")); Long e = System.currentTimeMillis(); }}
[解决办法]