XML學習筆記(三)

l         最後要講的是XMLJAVA中的解析。

先說說Xpath(XML Path Language)

1.       絕對路徑以“//”開始,如訪問person可以用“//plan/person”

2.       查找。如”//plan/person/name['吳仁海']”表示查name的值爲吳仁海的節點。如果找屬性值加“@”號。如“ //plan/person/task/date[@type='deadtime']”。

3.       父節點、兄弟節點等。注:Xpath是有方向的。如Following-sibling表示向下同伴節點,要向前則要用Preceding-sibling

JDK 1.5中用javax.xml.xpath.*這個包,在JDK1.4中用org.apache.xpath.*這個包。兩個包在具體的建立文檔連接時,基本一樣,但用法上還是有區別的,前者要精確到”//plan/person/node()”,”//plan/person/name/text()”,後者只要用”//plan/person”這樣就可以訪問person節點下所有的內容了。這次主要用後者。

1.  獲取XML文檔,通過org.w3c.dom.Document工廠模式(據說這樣可以跨平臺,不是很懂)

    /**

     * 獲取XML文檔

     *

     * @param url String

     * @return Document

     * @throws Exception

     */

    public static Document readerXmlFile(String url) throws Exception {

        try {

            /** 獲取文檔 */

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = factory.newDocumentBuilder();

            Document xDoc = builder.parse(url);

            return xDoc; /** 返回 */

        } catch (IOException ex) {

            throw new Exception("文件讀取錯誤", ex);

        } catch (SAXException ex) {

            throw new Exception("XML解析錯誤", ex);

        } catch (ParserConfigurationException ex) {

            throw new Exception("配置錯誤", ex);

        }

}

2.  讀取節點,有兩點類型:

Node person = XPathAPI.selectSingleNode( planDoc.getDocumentElement(), "//person[name='吳仁海']/group");

Element person = (Element) XPathAPI.selectSingleNode(planDoc.                    getDocumentElement(), "//person[name='吳仁海']/group");

PS:其中Element Extends Node,是新類,網絡上的資料表示,現在都用後者。

然後用person.getFirstChild().getNodeValue()就可以取得group裏的值了(裏面的內容也是一個節點,這點可以以Schema創建時,有simpleType爲證)

3.  增加、修改、刪除。

關於修改直接用person.getFirstChild().setNodeValue()即可。而刪除則person.removeNode()

但是增加方面則一定要由Element person = Document.createElement(“person”)來創建。還有一點Text name = Document.createTextNode(“吳仁海”)是用來創建某節點裏的具體值。然後可以用person.appendChild(name)來增加。

4.  保存XML。代碼如下

    /**

     * 保存XML文件

     *

     * @param doc Document

     * @param url String

     * @throws IllegalArgumentException

     * @throws TransformerFactoryConfigurationError

     * @throws Exception

     */

    public static void saveXMLFile(Document doc, String url) throws

            IllegalArgumentException, TransformerFactoryConfigurationError,

            Exception {

        try {

            /** 首先創建一個TransformerFactory對象,再由此創建Transformer對象。 */

            TransformerFactory tf = TransformerFactory.newInstance();

            Transformer t = tf.newTransformer();

            /** Transformer的輸出屬性, XSLT的省缺輸出, java.util.Properties */

            Properties properties = t.getOutputProperties();

            /** 輸出字付編碼:GB2312,支持中文 */

            properties.setProperty(OutputKeys.ENCODING,

                                   "GB2312");

            properties.setProperty(OutputKeys.DOCTYPE_SYSTEM,

                                   "D://XML//plan.dtd");

            /** 更新XSLT引擎的輸出 */

            t.setOutputProperties(properties);

            /** 調用XSLT輸出, 輸出DOM Tree中的內容到輸出介質中 */

            t.transform(new DOMSource(doc),

                        new StreamResult(new FileOutputStream(url)));

            t.clearParameters();

            t = null;

            tf = null;

        } catch (TransformerConfigurationException ex) {

            throw new Exception("文件保存失敗", ex);

        } catch (FileNotFoundException ex) {

            throw new Exception("文件保存失敗", ex);

        } catch (TransformerException ex) {

            throw new Exception("文件保存失敗");

        }

}

 

總結,學完以上東西,XML也算是入門了吧。但是還是有很多東西還是不怎麼懂,繼續學習中。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章