java XML解析-我們到底能走多遠系列(12)

來源:互聯網
上載者:User
我們到底能走多遠系列(12)

扯淡:距離 我們到底能走多遠系列 的階段性目標15篇,已經很近了,100篇的最終目標還很遠。

   最近,接到個面試通知,做了份筆試,大部分都是基礎題目,有java的,sql的。看來下一次換工作的征途又要開始啦,哈哈。

  只記得有個簡單的小題目了,把ABC,變成CBA。很簡單的基礎題,只是我實在記不起那個筆試題裡的其他題目了。哎...

實現:

package code.stu.string;public class Inversion {        public static void main(String[] args) {        System.out.println(inversion("abcdefghijk"));            }        public static String inversion(String str){                char[] chars = str.toCharArray();// String 轉換成char[]        int len = chars.length;        int min = 0;        int max = len - 1;        char value;        while(min < len/2 || max > len/2){// 對調進行到中間位置就跳出迴圈            // 三步互換            value = chars[min];            chars[min] = chars[max];            chars[max] = value;            min++;            max--;        }                return String.valueOf(chars);// char[]轉換成String    }}

 

主題:

  我們對xml解析都不陌生,很多地方有涉及到它,比如:Spring,tomcat,ibatis,都有用xml。

  介紹下java解析xml的兩種方式:DOM和SAX

   DOM的方式是吧整個xml檔案讀到記憶體中,進行解析。

   SAX的方式則是一步步讀取每一個節點和內容而觸發事件進行解析。

兩種代碼調用的方式如下:其實他們的源碼也值得有儘力的朋友解讀啊。

  Dom:


/**     *      * @param path 設定檔路徑     * @param nodeName 節點名     * @param nodeValue 修改成什麼樣value     * @return     * @throws Exception     */    public int changeConfig1(String path, String nodeName, String nodeValue) throws Exception{        File config = new File(path);        // 解析器工廠類        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         // 解析器        DocumentBuilder db = dbf.newDocumentBuilder();        // 文檔樹模型Document        Document document = db.parse(config);        // A.通過xml文檔解析        NodeList nodeList = document.getElementsByTagName(nodeName);        // B.將需要解析的xml文檔轉化為輸入資料流,再進行解析        //InputStream is = new FileInputStream(config);        //Document nodeList = db.parse(is);         for (int i = 0; i < nodeList.getLength(); i++) {               // Element extends Node            Element node = (Element)nodeList.item(i);            System.out.println( node.getElementsByTagName("b").item(0).getFirstChild().getNodeValue());            node.getElementsByTagName(nodeName).item(0).getFirstChild().setTextContent(nodeValue);            System.out.println( node.getElementsByTagName("c").item(0).getFirstChild().getNodeValue());        }        // 是改動生效,網上很多代碼都沒有提到這步操作,我不明白他們是怎麼完成修改xml的value值的。        // 可以理解成記憶體中的資料已經被改了,還沒有映射到檔案中        TransformerFactory tfFac = TransformerFactory.newInstance();        Transformer tf = tfFac.newTransformer();        DOMSource source = new DOMSource(document);        tf.transform(source, new StreamResult(config));// 修改內容映射到檔案        return 0;    }
 

 

  SAX:

package web.method.file.sax;import java.io.FileReader;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import org.xml.sax.helpers.XMLReaderFactory;import web.method.file.model.People;// 繼承DefaultHandlerpublic class ConfigHandler extends DefaultHandler {    private final List<People> peoples = new ArrayList<People>();    private People p;    private String currentValue = null;    private String preTag = null;    @Override    // 開始Element    public void startElement(String uri, String localName, String name,            Attributes attributes) throws SAXException {        if("people".equals(name)){            p = new People();        }        preTag = name;    }    @Override    // 結束Element    public void endElement(String uri, String localName, String name)            throws SAXException {        if("people".equals(name) && p != null){            peoples.add(p);        }        preTag = null;    }    @Override    // 值    public void characters(char[] ch, int start, int length)            throws SAXException {        currentValue = new String(ch, start, length);                if(preTag != null && p != null){            if(preTag.equals("name")){                p.setName(currentValue);            }else if(preTag.equals("from")){                p.setFrom(currentValue);            }                    }    }    // 取值    public List<People> getPeoples(){        return peoples;    }        public static void main(String[] args) throws Exception {        ConfigHandler handler = new ConfigHandler();                //建立一個XML解析器(通過SAX方式讀取解析XML)          XMLReader reader = XMLReaderFactory.createXMLReader(); //設定XML解析器的處理文檔內容相關事件的處理器          reader.setContentHandler(handler);         //解析books.xml文檔         reader.parse(new InputSource(new FileReader("D:\\我的文件\\company.xml")));                 for (int i = 0; i < handler.getPeoples().size(); i++) {            System.out.println(handler.getPeoples().get(i).getName());        }    }}

xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><company  count="3" xmlns="http://test.org/company">  <people><name>dc</name><age>96</age><from>los angles</from><discription>have biggest mind in the world</discription></people><people><name>jiannanchun</name><age>96</age><from>las vages</from><discription>a good defender</discription></people></company> 

總結:這隻是對解析xml的開始,先學會怎麼用吧。

為什麼要繼續對這方面學習呢?因為現在自己閒置時候,在編個工程,想用xml來存資料。在這方面學習過的朋友給點建議哦。

現在遇到的問題是:怎樣設計一個多線程讀取xml檔案內容的結構?有想法的給點建議。

 

讓我們繼續前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不會成功。
共勉。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.