美文网首页我爱编程
java xml处理总结

java xml处理总结

作者: 吃猫的鱼0 | 来源:发表于2018-02-02 11:13 被阅读0次

    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

    相关文章

      网友评论

        本文标题:java xml处理总结

        本文链接:https://www.haomeiwen.com/subject/nsbuoxtx.html