xml解析技術常用的有兩類:dom解析和sax解析。
dom:(Document Object Model, 即文檔物件模型)是W3C組織推薦的處理XML的一種方式。
sax:(Simple API for XML)不是官方標準,但它是XML社群事實上的標準,幾乎所有的XML解析器都支援它。
Jaxp(Java API for XML Processing)是Java對XML進行程式設計的開發包,它由javax.xml、org. w3c.dom 、org.xml.sax 包及其子包組成。
在 javax.xml.parsers包中,定義了幾個工廠類,程式設計師調用這些工廠類,可以得到對 xml文件進行解析的 DOM 或 SAX 的解析器物件。
DOM(Document Object Model文檔物件模型),是W3C組織推薦的處理可擴展標誌語言的標準程式介面。 XML DOM 定義了所有 XML 元素的物件和屬性,以及存取它們的方法(介面)。
DOM解析器在解析XML文件時,會把文件中的所有元素,按照其出現的層次關係,解析成一個個Node物件(節點)。
在dom中,節點之間關係如下:
1、位於一個節點之上的節點是該節點的父節點(parent)
2、一個節點之下的節點是該節點的子節點(children)
3、同一層次,具有相同父節點的節點是兄弟節點(sibling)
4、一個節點的下一個層次的節點集合是節點後代(descendant)
5、父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)
Node物件提供了一系列常數來代表結點的類型,當開發人員取得某個Node類型後,就可以把Node節點轉換成對應的節點對象(Node的子類別物件),以便於呼叫其特有的方法。 (查看API文件)
Node物件提供了相應的方法去獲得它的父結點或子結點。程式設計人員透過這些方法就可以讀取整個XML文件的內容、或新增、修改、刪除XML文件的內容了。
PS:其子介面Element功能更多。
1、呼叫DocumentBuilderFactory.newInstance()方法建立DOM解析器的工廠。
2、呼叫DocumentBuilderFactory物件的newDocumentBuilder()方法得到 DOM解析器物件,其是DocumentBuilder的物件。
3、呼叫DocumentBuilder物件的parse()方法解析 XML文檔,得到代表整個文檔的Document對象。
4、透過Document物件和一些相關類別和方法,對XML文檔進行操作。
javax.xml.transform包中的 Transformer類別用來把代表XML檔案的Document物件轉換為某種格式後進行輸出,例如把xml檔案套用樣式表後轉成一個html文件。利用這個對象,當然也可以把Document物件又重新寫入到一個XML檔案中。
Transformer類別透過transform方法完成轉換操作,該方法接收一個來源和一個目的地。我們可以透過:
javax.xml.transform.dom.DOMSource類別來關聯要轉換的document對象,
以javax.xml.transform.stream.StreamResult 物件來表示資料的目的地。
Transformer物件透過TransformerFactory取得。
案例:
XML5.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><班级 班次="1班" 编号="C1"> <学生 地址="湖南" 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1"> <名字>张三</名字> <年龄>20</年龄> <介绍>不错</介绍> </学生> <学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="C1"> <名字>李四</名字> <年龄>18</年龄> <介绍>很好</介绍> </学生> <学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1"> <名字>王五</名字> <年龄>22</年龄> <介绍>非常好</介绍> </学生> <学生 性别="男"> <名字>小明</名字> <年龄>30</年龄> <介绍>好</介绍> </学生> </班级>
package com.pc; import java.awt.List; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * * @author Switch * @function Java解析XML * */ public class XML5 { // 使用dom技术对xml文件进行操作 public static void main(String[] args) throws Exception { // 1.创建一个DocumentBuilderFactory对象 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance(); // 2.通过DocumentBuilderFactory,得到一个DocumentBuilder对象 DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder(); // 3.指定解析哪个xml文件 Document document = documentBuilder.parse("src/com/pc/XML5.xml"); // 4.对XML文档操作 // System.out.println(document); // list(document); // read(document); // add(document); // delete(document, "小明"); update(document, "小明", "30"); } // 更新一个元素(通过名字更新一个学生的年龄) public static void update(Document doc, String name, String age) throws Exception { NodeList nodes = doc.getElementsByTagName("名字"); for (int i = 0; i < nodes.getLength(); i++) { Element nameE = (Element) nodes.item(i); if (nameE.getTextContent().equals(name)) { Node prNode = nameE.getParentNode(); NodeList stuAttributes = prNode.getChildNodes(); for (int j = 0; j < stuAttributes.getLength(); j++) { Node stuAttribute = stuAttributes.item(j); if (stuAttribute.getNodeName().equals("年龄")) { stuAttribute.setTextContent(age); } } } } updateToXML(doc); } // 删除一个元素(通过名字删除一个学生) public static void delete(Document doc, String name) throws Exception { // 找到第一个学生 NodeList nodes = doc.getElementsByTagName("名字"); for (int i = 0; i < nodes.getLength(); i++) { Node node = nodes.item(i); if (node.getTextContent().equals(name)) { Node prNode = node.getParentNode(); prNode.getParentNode().removeChild(prNode); } } // 更新到XML updateToXML(doc); } // 添加一个学生到XML文件 public static void add(Document doc) throws Exception { // 创建一个新的学生节点 Element newStu = doc.createElement("学生"); newStu.setAttribute("性别", "男"); Element newStu_name = doc.createElement("名字"); newStu_name.setTextContent("小明"); Element newStu_age = doc.createElement("年龄"); newStu_age.setTextContent("21"); Element newStu_intro = doc.createElement("介绍"); newStu_intro.setTextContent("好"); newStu.appendChild(newStu_name); newStu.appendChild(newStu_age); newStu.appendChild(newStu_intro); // 把新的学生节点添加到根元素 doc.getDocumentElement().appendChild(newStu); // 更新到XML updateToXML(doc); } // 更新到XML private static void updateToXML(Document doc) throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException { // 得到TransformerFactory对象 TransformerFactory transformerFactory = TransformerFactory .newInstance(); // 通过TransformerFactory对象得到一个转换器 Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(doc), new StreamResult( "src/com/pc/XML5.xml")); } // 具体查询某个学生的信息(小时第一个学生的所有) public static void read(Document doc) { NodeList nodes = doc.getElementsByTagName("学生"); // 取出第一个学生 Element stu1 = (Element) nodes.item(0); Element name = (Element) stu1.getElementsByTagName("名字").item(0); System.out.println("姓名:" + name.getTextContent() + " 性别:" + stu1.getAttribute("性别")); } // 遍历该XML文件 public static void list(Node node) { if (node.getNodeType() == node.ELEMENT_NODE) { System.out.println("名字:" + node.getNodeName()); } // 取出node的子节点 NodeList nodes = node.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { // 显示所有子节点 Node n = nodes.item(i); list(n); } } }
以上就是XML程式設計-DOM的內容,更多相關內容請關注PHP中文網(www.php.cn)!