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
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());
}
}
cheaperget
12345678
notknown@yahoo.com
200508
361021
0592-6888888
xx省xx市银江路108号
dreaninboy
22345678
greatman@yahoo.com
200505
215006
0512-6188888
xx省xx市人民路108号
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
//获取第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
//显示元素的名字和元素的内容
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
Node att=atts.item(j);
System.out.println("--"+att.getNodeName());
System.out.println("/"+att.getNodeValue());
}
}
}
}
}