日期:2014-05-17  浏览次数:20714 次

有关解析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) {
                xml