1.JAXP(java API for XML Processing)
JAXP使得用java开发处理XML数据的应用程序非常容易,JAXP包括语法分析器、标准SAX与DOM,可以选择以事件流或建立对象表示来解析数据。
JAXP提供的类和方法,可以让java应用程序使用DOM解析或转换XML文件。
2.常用的DOM接口
DOM定义了一套标准的接口以便按照程序的设计显示XML文档。当然,DOM不能实现定义的接口,而支持DOM的XML解析器必须实现DOM所定义的接口。
3.加载XML文档文件
(1)首先需要导入相关的套件
import javax.xml.parsers.*;
import org.sax.*;
import org.w3c.dom.*;
import java.io.*;
其中org.sax.*套件是解析错误处理的相关套件,此外因为XML文件属于文本文件,导入文件处 理的套件java.io.*。
(2)在JAXP中,DOM解析器称为DocumentBuilder,可以通过工厂类DocumentBuilderFactory获得 ,而document对象则可以通过类DocumentBuilder获得,使用try catch指令建立解析的错误 处理。在建立DocumentBuilder对象后,可使用parser方法解析加载XML文件,file对象加载 后就可以处理XML文件的节点内容,程序架构如下:
//获得一个XML文件的解析器
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try{
//解析XML文件生成DOM文档的接口类,以便访问DOM
DocumentBuilder db=dbf.newDocumentBuilder();
document=db.parser(new File("xml文件"));
...
}catch(Exception ef){
ef.printStackTrack();
}
(3)获得接口类document实例后,就可以对DOM的文档树进行访问。如要遍历DOM文档,首先要获得根节点,然后获得根节点的子节点列表。
//获得根节点
Element element=document.getDocumentElement();
//获得根节点的子节点列表
NodeList childs=element.getChildNodes();
package XML操作1004; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class code10_1 { static Document document; public static void main(String[] args) { // if(args.length!=1){ // System.out.println("加载XML file"); // return; // } DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try{ dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db=dbf.newDocumentBuilder(); //读入xml文档 document=db.parse(new File("C:\\Users\\chenshao\\workspace\\java操作数据库\\src\\XML操作1004\\code10_1.xml")); //遍历xml文档 walkNode(document.getDocumentElement()); }catch(Exception ef){ ef.printStackTrace(); } } private static void walkNode(Node anode){ NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;i<child.getLength();i++){ Node node=child.item(i); if(node.hasChildNodes()){ walkNode(node); }else{ printNode(node); } } } private static void printNode(Node bnode){ System.out.println(bnode.getNodeName()+","+bnode.getNodeValue()); } }
<?xml version="1.0" encoding="UTF-8"?> <!--DOCTYPE customers SYSTEM "code10_2.dtd"--> <customers> <customer ID="c0555103"> <username>cheaperget</username> <password>12345678</password> <email>[email protected]</email> <registerdate>200508</registerdate> <address> <zipcode>361021</zipcode> <phone>0592-6888888</phone> <street>xx省xx市银江路108号</street> </address> </customer> <customer ID="c0555208"> <username>dreaninboy</username> <password>22345678</password> <email>[email protected]</email> <registerdate>200505</registerdate> <address> <zipcode>215006</zipcode> <phone>0512-6188888</phone> <street>xx省xx市人民路108号</street> </address> </customer> </customers>
4.访问XML元素和属性
在DOM接口规范中,有4个基本接口:Document、Node、NodeList、Element。在这4个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,入Document、Element,Text、Comment等接口都是从Node接口继承错来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。
1.Document接口
Document接口代表了整个XML文档,因此,它是整个文档树的根,提供了对文档中数据进行 访问和操作的入口。通过Document节点,可以访问到文档中的其他节点。
方法描述:
(1)getDocumentElement(),Document对象使用该方法可获取XML文件的根节点
(2) getElementByTagName(),Document使用标记名获取子节点,取出的节点是一个 NodeList对象。
2.Node接口
在DOM树中,Node接口代表了树中的一个节点
方法描述:
(1)getChildNodes(),获取子节点的NodeList节点对象列表,即子节点数
(2)getNodeName(),返回节点名称
(3)getNodeType(),返回节点类型的代码
(4)getNodeValue(),返回节点的值
(5)getFirstChild(),获取第一个子节点
(6)getNextSibling(),获取此节点的兄弟节点,即同级的下一个节点
(7)getLastChild(),获取最后一个节点
(8)getParentNode(),获取父节点
(9)hasChildNodes(),Node节点对象检查是否拥有子节点,是返回TRUE,否FALSE
3.Element接口
Element接口代表了XML文档中的元素,提供了访问DOM树中元素内容与信息的途径。
方法描述:
(1)getElementByTagName(String),通过标记名称获取元素
(2)getTagName(),获取元素的标记的名称
(3)getAttributes(String),获取元素的属性,是属性对象列表,属于NamedNodeMap
(4)getAttributeNode(String),通过属性的名字得到一个属性类型节点
4.NamedNodeMap属性列表对象
NamedNodeMap对象可以获取元素的属性列表,因为一个元素可以有多个属性。
访问特定的元素和属性,可以使用Document对象的getElementByName方法获取指定的XML元素。如获得password标记的第二个password标记:
//获得password标记的NodeList节点列表
NodeList passwords=Document.getElementByTagName("password");
//item方法指出为第二个password标记
system.out.println("元素名称:"+passwords.item(1).getNodeName());
package XML操作1004; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class code10_3 { static Document document; public static void main(String[] args) { DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try{ DocumentBuilder db=dbf.newDocumentBuilder(); //读入xml文档 document=db.parse(new File("C:\\Users\\chenshao\\workspace\\java操作数据库\\src\\XML操作1004\\code10_1.xml"));//文件路径 //获得根元素 Node root=document.getDocumentElement(); //获得根元素的子节点列表 NodeList childs=root.getChildNodes(); getElement(childs); }catch(Exception ef){ ef.printStackTrace(); } } public static void getElement(NodeList childs){ int i=0; if(childs.getLength()==0){ //该节点没有子节点 System.out.println("该节点没有子节点!"); } for(i=0;i<childs.getLength();i++){ //获取第i个子节点 Node node=childs.item(i); //获取节点的类型,可以是ElementNode,TextNode,DocumentNode等 short nodetype=node.getNodeType(); //ElementNode类型的节点可以包含子节点和属性等 if(nodetype==Node.ELEMENT_NODE){ //得到节点的名称 String name=node.getNodeName(); String attrValue="",attrName=""; System.out.println("这是一个元素,名字是:"+name); if(node.hasAttributes()){ /*取出一个元素的属性,得到的是一个属性对象列表(NameNodeMap)在此因为文档中只有一个属性,所以只取 * NameNodeMap中的第0个值*/ Node attrNode=node.getAttributes().item(0); //取出该节点的Name和value,即是一个ElementNode的属性名称和属性值 attrName=attrNode.getNodeName(); attrValue=attrNode.getNodeValue(); System.out.println("this element attr is:"+attrValue+";attrName is:"+attrName); } //如果有子节点,递归调用getElement() if(node.hasChildNodes()){ getElement(node.getChildNodes()); } } //Text类型没有子节点,节点名为#text,节点的值为xml文档中元素的值 if(nodetype==Node.TEXT_NODE){ //该节点的name是#text String txtName=node.getNodeName(); String txtValue=node.getNodeValue(); if(txtValue.trim().length()>0){ System.out.println("txtName:"+txtName+";txtValue:"+txtValue); } } } } }
XML文件仍为code10_1.xml
5.使用DOM创建XML文档
1)创建XML文档
可以使用newDocument方法创建XML文档
document=db.newDocument();
2)建立新的节点
使用Document对象的方法建立所需节点对象
方法说明
createElement(String)建立XML元素的节点,参数为标记名称
createAttribute(string)建立属性名称的属性节点,参数是属性名称
createCDATASection(string)建立CDATA块,参数是文字内容
createComment(String)建立注释文字节点,参数为注释文字内容
createTextNode(String)建立文字节点,参数为内容
3)指定插入的位置
在建立好XML元素的对象好,可以使用Node节点对象的方法添加到DOM树中:
appendChild(newNode),新添加一个newNode节点
insertBefore(newNode,befnode),将newNode节点插到befnode节点前
4)新增元素内容
使用 createTextNode方法建立文字节点后,在使用appendChild方法将它添加到元素节点中
5)新增元素的属性
使用setAttribute方法给Element元素对象增加属性
6)删除元素或属性
如果要删除节点可使用Node节点的removeChild方法删除指定的节点,如果要删除属性可以使 用Element元素对象的removeAttribute方法删除
//删除第一customer节点
root.removeChild((Element)root.getElementsByTagName("customer").item(0));
//删除属性
Element node=(Element)root.getFirstChild();
node.removeAttribute("ID");
package XML操作1005; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class code10_5 { static Document document; public static void main(String[] args) throws Exception{ DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); DocumentBuilder db=dbf.newDocumentBuilder(); //建立新的Xml文件 document=db.newDocument(); //建立根元素 Element root=(Element)document.createElement("customer"); document.appendChild(root); //新增子元素customerID Element newNode=(Element)document.createElement("customerID"); root.appendChild(newNode); //增加元素的内容 newNode.appendChild(document.createTextNode("ID")); //增加元素的属性 newNode=(Element) root.getFirstChild(); newNode.setAttribute("ID", "c050013"); //新增子元素username newNode=document.createElement("username"); root.appendChild(newNode); //增加元素的内容 newNode.appendChild(document.createTextNode("cheaperget")); //新增子元素password newNode=document.createElement("password"); //新增元素插在根元素的最后一个孩子前面 root.insertBefore(newNode, root.getLastChild()); //增加元素的内容 Node text=document.createTextNode("12345678"); //插入内容节点到根节点的第二个孩子节点 Node temp=root.getFirstChild(); temp.getNextSibling().appendChild(text); //显示XML文件 System.out.println("根元素:"+root.getNodeName()); //获取根元素的所有子节点 NodeList childs=root.getChildNodes(); for(int i=0;i<childs.getLength();i++){ //显示元素的名字和元素的内容 System.out.println("元素:"+childs.item(i).getNodeName()); System.out.println("/"+childs.item(i).getFirstChild().getNodeValue()); //显示元素的属性 if(childs.item(i).hasAttributes()){ //属性列表 NamedNodeMap atts=childs.item(i).getAttributes(); //使用for循环获取各属性的名称和值 for(int j=0;j<atts.getLength();j++){ Node att=atts.item(j); System.out.println("--"+att.getNodeName()); System.out.println("/"+att.getNodeValue()); } } } } }