<?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的话试过了,就是取不到,请高手指教。

解决方案 »

  1.   

    用SAX吧,如果你只要取其中的某一个或某几个用SAX性能比dom要好,因为dom首先是将xml文件全部解析,而“SAx根据其节点元素查找
      

  2.   

    LZ可以看看关于JDOM解析的相关知识,一言两语讲不清楚
      

  3.   

    如果你的格式就是按你说的这样只想取得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()就可以取得元素中的值了。这个最简单了,定位快
      

  4.   

    Dom4J怎么会取不得呢?很容易取到。
    document.selectNodes("//emailNum");
      

  5.   

    private static void parseElement(Element element) {
    String tagName = element.getNodeName();
    NodeList children = element.getChildNodes();
    System.out.print("<" + tagName);
    NamedNodeMap map = element.getAttributes();
    if (null != map) {
    for (int i = 0; i < map.getLength(); i++) {
    Attr attr = (Attr) map.item(i);
    String attrName = attr.getName();
    String arrtValue = attr.getValue();
    System.out.print(" " + attrName + "= '" + arrtValue + "'");
    }
    }
    System.out.print(">"); for (int i = 0; i < children.getLength(); i++) {
    Node node = children.item(i);
    short nodeType = node.getNodeType();
    // 获得结点类型
    if (nodeType == Node.ELEMENT_NODE) {
    parseElement((Element) node);
    } else if (nodeType == Node.TEXT_NODE) {
    System.out.print(node.getNodeValue());
    } else if (nodeType == Node.COMMENT_NODE) {
    System.out.print("<!--");
    Comment comment = (Comment)node;
    String data = comment.getData();
    System.out.println(data+"-->");
    }
    }
    System.out.println("</"+tagName+">");
    }
      

  6.   

    是因为<soap:Envelope xmlns 命名空间的问题吧
    Element cnml//带有命名空间的节点,也就是你的soap:Envelope节点
    HashMap<String, String> xmlMap = new HashMap<String, String>();
    xmlMap.put("nameSpace", cnml.getNamespaceURI());
    reader.getDocumentFactory().setXPathNamespaceURIs(xmlMap)
    HashMap里的键是自定义的字符串,cnml.getNamespaceURI()值就是默认的命名空间对应的URIElement subTitle = (Element) doc.selectSingleNode("//hashmap的key:节点/hashmap的key:节点");我遇到过xpath解析获取不到节点是因为命名空间的问题,你可以试试 。
      

  7.   


    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();
    }
    }
    我的思路,很简单,把每个有值的节点存进map,其key的规律如下
    如:
    <root>
    <person>
    <name>
    楼主
    </name>
    </person>
    </root>那么去楼主的值为:map.get("root.person.name");这是鄙人xml的工具类,生成和读取
      

  8.   


    dom4j有个xpath啊,
    <emailNum>50000</emailNum>和<emailResult>1000</emailResult>
    doc.selectSingleNode("//emailNum").getText();
    doc.selectSingleNode("//emailResult").getText();
    这样即可