<?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的话试过了,就是取不到,请高手指教。
<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的话试过了,就是取不到,请高手指教。
可以用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()就可以取得元素中的值了。这个最简单了,定位快
document.selectNodes("//emailNum");
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+">");
}
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解析获取不到节点是因为命名空间的问题,你可以试试 。
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的工具类,生成和读取
dom4j有个xpath啊,
<emailNum>50000</emailNum>和<emailResult>1000</emailResult>
doc.selectSingleNode("//emailNum").getText();
doc.selectSingleNode("//emailResult").getText();
这样即可