xpath解析心得
xml解析笔记
做了这么多xml解析用的最多的就是DOM4j,感觉使用最方便,最简单,
首先说要导的包:dom4j-1.6.1.jar
常用的方法:
string装成element对象
DocumentHelper.parseText(string)
在element2后面添加element1节点后拼接
element2.appendContent(element1);
查找某个节点最常用的就是xpath解析了,
xpath解析必须导入DOM4j及jaxen-1.1-beta-6.jar
/ 表示当前节点下的
// 在当前节点下所有里面查找
@ 属性名
[] 判断
//节点名[@属性名='name'] 选择节点名下是属性名属性值为name的dom对象
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
element("name");获取第一个子节点名称是name的元素
elements("name");获取所有的子节点名称为name的元素
getText();获取指定元素的元素内容为文本的值
getStringValue();获取所有子元素文本值并且追加
getName();获取元素的名称
attribute(name);获取指定属性名称所对应的属性值
xpath = "//contact[@id = '001']";
Element contactElem = (Element)doc.selectSingleNode(xpath);
例子
selectNodes.java
package com.zy.xpath;
import java.io.File;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
*
* @author shutu008
*selectNode的使用方法
*/
public class selectNodes {
public static void main(String[] args) throws Exception {
Document doc = new SAXReader().read(new File("./src/contact.xml"));
/**
* @param xpath 表示xpath语法变量
*/
String xpath="";
/**
* 1. / 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
*/
xpath = "/contactList";
xpath = "/contactList/contact";
/**
* 2. // 相对路径 表示不分任何层次结构的选择元素。
*/
xpath = "//contact/name";
xpath = "//name";
/**
* 3. * 通配符 表示匹配所有元素
*/
xpath = "/contactList/*"; //根标签contactList下的所有子标签
xpath = "/contactList//*";//根标签contactList下的所有标签(不分层次结构)
/**
* 4. [] 条件 表示选择什么条件下的元素
*/
//带有id属性的contact标签
xpath = "//contact[@id]";
//第二个的contact标签
xpath = "//contact[2]";
//选择最后一个contact标签
xpath = "//contact[last()]";
/**
* 5. @ 属性 表示选择属性节点
*/
xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
xpath = "//contact[not(@id)]";//选择不包含id属性的contact标签节点
xpath = "//contact[@id='002']";//选择id属性值为002的contact标签
xpath = "//contact[@id='001' and @name='eric']";//选择id属性值为001,且name属性为eric的contact标签
/**
*6. text() 表示选择文本内容
*/
//选择name标签下的文本内容,返回Text对象
xpath = "//name/text()";
xpath = "//contact/name[text()='张三']";//选择姓名为张三的name标签
List<Node> list = doc.selectNodes(xpath);
for (Node node : list) {
System.out.println(node);
}
// //写出xml文件
// //输出位置
// FileOutputStream out = new FileOutputStream("d:/contact.xml");
//
// //指定格式
// OutputFormat format = OutputFormat.createPrettyPrint();
// format.setEncoding("utf-8");
// XMLWriter writer = new XMLWriter(out,format);
//
// //写出内容
// writer.write(doc);
//
// //关闭资源
// writer.close();
}
}
selectNodes.java
package com.zy.xpath;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
*
* @author shutu008
*selectSingleNode的使用
*/
public class selectSingleNode{
public static void main(String[] args) throws Exception{
//读取XML文件,获得document对象
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new File("./src/contact.xml"));
//使用xpath获取某个节点
String xpath = "";
//对contact元素 id="001"的节点,操作
xpath = "//contact[@id = '001']";
Element contactElem = (Element)doc.selectSingleNode(xpath);
//设置这个节点的属性值
contactElem.addAttribute("name", "001");
//输出这个节点的所有属性值
for(Iterator it = contactElem.attributeIterator();it.hasNext();){
Attribute conAttr = (Attribute)it.next();
String conTxt = conAttr.getValue();
String conAttrName = conAttr.getName();
System.out.println(conAttrName+" = "+conTxt);
}
}
}
DOM4j解析
常用方法
字符串转XML
DOM4j
String xmlStr = \"......\";
Document document = DocumentHelper.parseText(xmlStr);
最原始的javax.xml.parsers,标准的jdk api
StringReader sr = new StringReader(xmlStr);
InputSource is = new InputSource(sr);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(is);
xml转字符串
DOM4j
Document document = ...;
String text = document.asXML();
最原始的javax.xml.parsers,标准的jdk api
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty(\"encoding\",\"GB23121\");//解决中文问题,试过用GBK不行
ByteArrayOutputStream bos = new ByteArrayOutputStream();
t.transform(new DOMSource(doc), new StreamResult(bos));
String xmlStr = bos.toString();
XML拼接
element.appendContent(DocumentHelper.parseText(string)); //string装成element后拼接DOME4J
xml 转换为 Map
方法一
/**
* 简单 xml 转换为 Map
* @param reader
* @return
*/
public static Map<String,String> xmlToMap(String xml){
try {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(new ByteArrayInputStream(xml.getBytes()));
Element element = document.getDocumentElement();
NodeList nodeList = element.getChildNodes();
Map<String, String> map = new LinkedHashMap<String, String>();
for(int i=0;i<nodeList.getLength();i++){
Element e = (Element) nodeList.item(i);
map.put(e.getNodeName(),e.getTextContent());
}
return map;
} catch (DOMException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
方法二
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class XmlUtils {
private static final String HEAD = "head";
private static final String BODY = "body";
public static void main(String[] args) throws DocumentException {
String xml = "<ap> <head> <tr_code>330003</tr_code> <corp_no>8000500436</corp_no> <user_no>22222</user_no> <req_no>123456789001</req_no> <tr_acdt>20160510</tr_acdt> <tr_time>151238</tr_time> <atom_tr_count>1</atom_tr_count> <channel>0</channel> <reserved /> </head> <body> <cert_no>TEST01234</cert_no> <pay_acno>310066865018010123060</pay_acno> <type>S</type> <sum>1</sum> <sum_amt>0.01</sum_amt> <pay_month>201605</pay_month> <summary>测试0.01</summary> <busi_no>3100012379</busi_no> <selsec_flg>0</selsec_flg><tran><rcd><card_no>00000001</card_no><acname>测试账号</acname><card_flag>0</card_flag><amt>21.01</amt><busino>111111111</busino></rcd><rcd><card_no>00000001</card_no><acname>测试账号</acname><card_flag>0</card_flag><amt>21.01</amt><busino>111111111</busino></rcd></tran> </body></ap>";
System.out.println(parseXmlStr(xml).toString());
}
/**
* 解析XML字符串
*
* @param xml
* @return
* @throws DocumentException
*/
private static Map<String, Object> parseXmlStr(String xml)
throws DocumentException {
Document document = DocumentHelper.parseText(xml);
Element root = document.getRootElement();
return parseElement(root);
}
/**
* 解析Element
*
* @param root
* @return
*/
@SuppressWarnings("unchecked")
private static Map<String, Object> parseElement(Element root) {
String rootName = root.getName();
Iterator<Element> rootItor = root.elementIterator();
Map<String, Object> rMap = new HashMap<>();
List<Map<String, Object>> rList = new ArrayList<>();
Map<String, Object> rsltMap = null;
while (rootItor.hasNext()) {
Element tmpElement = rootItor.next();
String name = tmpElement.getName();
if (rsltMap == null || (!HEAD.equals(name) && !BODY.equals(name)
&& !tmpElement.isTextOnly())) {
if (!HEAD.equals(name) && !BODY.equals(name)
&& !tmpElement.isTextOnly() && rsltMap != null) {
rList.add(rsltMap);
}
rsltMap = new HashMap<>();
}
if (!tmpElement.isTextOnly()) {
Iterator<Element> headItor = tmpElement.elementIterator();
while (headItor.hasNext()) {
Element hElement = headItor.next();
if (hElement.isTextOnly()) {
rsltMap.put(hElement.getName(), hElement.getTextTrim());
} else {
rsltMap.putAll(parseElement(hElement));
}
}
}
}
rList.add(rsltMap);
rMap.put(rootName, rList);
return rMap;
}
/**
* 简单 xmlstr 转换为 Map
* @param reader
* @return
*/
public static Map<String,String> xmlToMap(String xml){
try {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(new ByteArrayInputStream(xml.getBytes()));
Element element = document.getDocumentElement();
NodeList nodeList = element.getChildNodes();
Map<String, String> map = new LinkedHashMap<String, String>();
for(int i=0;i<nodeList.getLength();i++){
Element e = (Element) nodeList.item(i);
map.put(e.getNodeName(),e.getTextContent());
}
return map;
} catch (DOMException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
将map转xml
/**
* 将map转xml
* @param map
* @param sb
* @return
*/
@SuppressWarnings("rawtypes")
public static String mapToXML(Map map, StringBuffer sb) {
Set set = map.keySet();
sb.append("<xml>");
for (Iterator it = set.iterator(); it.hasNext();) {
String key = (String) it.next();
Object value = map.get(key);
if (null == value)
value = "";
if (value.getClass().getName().equals("java.util.ArrayList")) {
ArrayList list = (ArrayList) map.get(key);
sb.append("<" + key + ">");
for (int i = 0; i < list.size(); i++) {
HashMap hm = (HashMap) list.get(i);
mapToXML(hm, sb);
}
sb.append("</" + key + ">");
} else {
if (value instanceof HashMap) {
sb.append("<" + key + ">");
mapToXML((HashMap) value, sb);
sb.append("</" + key + ">");
} else {
sb.append("<" + key + ">" + value + "</" + key + ">");
}
}
}
sb.append("</xml>");
return sb.toString();
}
解析demo
Test.java
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Test {
public static void main(String[] args) throws Exception {
//创建解析器DOM4J对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("./phones.xml"));
Element rootElement = document.getRootElement();
List<Element>elements= rootElement.elements("phone"); // 获取根标签下标签名称为phone的element的集合
// System.out.println(elements.get(0).attributeValue("id"));//获取属性名称所对应的属性值
Iterator root_iterator = rootElement.elementIterator();
while(root_iterator.hasNext()){//用迭代器迭代
Element element = (Element) root_iterator.next();
System.out.println(element.getName());
}
}
}
phones.xml
<?xml version="1.0" encoding="UTF-8"?>
<phones>
<phone id="h2">
<name> 荣耀9</name>
<brand>华为</brand>
<price>1500</price>
</phone>
<phone id="h3">
<name> 荣耀6</name>
<brand>华为</brand>
<price>1800</price>
</phone>
<phone id="h1">
<name> 荣耀8</name>
<brand>华为</brand>
<price>1600</price>
</phone>
</phones>
参考文件:http://blog.csdn.net/arui_email/article/details/7703424
网友评论