我們到底能走多遠系列(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檔案內容的結構?有想法的給點建議。
讓我們繼續前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不會成功。
共勉。