java xml处理总结

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      000000001测试账号021.0111111111100000001测试账号021.01111111111   ";  
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> rList = new ArrayList<>();  
Map 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 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 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
将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("");  
  
            } else {  
                if (value instanceof HashMap) {  
                    sb.append("<" + key + ">");  
                    mapToXML((HashMap) value, sb);  
                    sb.append("");  
                } else {  
                    sb.append("<" + key + ">" + value + "");  
                }                   
            }     
        }  
        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

你可能感兴趣的:(java xml处理总结)