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 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 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 map = new LinkedHashMap();
for(int i=0;i
方法二
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 = " 330003 8000500436 22222 123456789001 20160510 151238 1 0 TEST01234 310066865018010123060 S 1 0.01 201605 测试0.01 3100012379 0 00000001 测试账号 0 21.01 111111111 00000001 测试账号 0 21.01 111111111 ";
System.out.println(parseXmlStr(xml).toString());
}
/**
* 解析XML字符串
*
* @param xml
* @return
* @throws DocumentException
*/
private static Map 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 parseElement(Element root) {
String rootName = root.getName();
Iterator rootItor = root.elementIterator();
Map rMap = new HashMap<>();
List
将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("");
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(" ");
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();
Listelements= 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
荣耀9
华为
1500
荣耀6
华为
1800
荣耀8
华为
1600
参考文件:http://blog.csdn.net/arui_email/article/details/7703424