l 最後要講的是XML在JAVA中的解析。
先說說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也算是入門了吧。但是還是有很多東西還是不怎麼懂,繼續學習中。