首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

有关解析XML的有关问题

2012-09-29 
有关解析XML的问题?xml version1.0 encodingutf-8?soap:Envelope xmlns:soaphttp://www.163.co

有关解析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();    }} 


[解决办法]

探讨
<?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">
<emailComR……

热点排行