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>notknown@yahoo.com</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>greatman@yahoo.com</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()); } } } } }
相关推荐
在探讨JAXP(Java API for XML Processing)这一主题时,我们需首先明确其在Java与XML领域中的定位与价值。JAXP并非旨在革新XML处理的方式,也不提供额外的语法分析功能,相反,它扮演着一个重要的角色——一个抽象...
Java API for XML Processing,简称JAXP,是Sun Microsystems推出的一种用于处理XML的Java接口,旨在为XML解析提供一种统一的、与供应商无关的访问方式。JAXP并不直接进行XML解析,而是作为一个抽象层,使得开发者...
4. **JAXP(Java API for XML Processing)**:JAXP提供了XML解析和转换的接口,支持DOM、SAX和XSLT,是Java平台上处理XML的基础。 5. **XPath**:XPath是用于在XML文档中查找信息的语言,它可以根据表达式选取节点...
此外,我们还将讨论如何利用Java API for XML Processing (JAXP) 来隐藏供应商特定的细节。 ### 1. 使用DOM处理整个XML文档 #### 1.1 DOM Level 2简介 DOM(Document Object Model)是一种平台和语言中立的接口,...
此外,JAXP(Java API for XML Processing)是Java中处理XML的标准接口,包括了DOM、SAX和XPath的API,用于查询和操作XML文档。 XML Schema(XSD)是用于定义XML文档结构的规范,书中会介绍如何使用XSD来验证XML...
Java的JAXP(Java API for XML Processing)提供了DOM、SAX和XSLT(XSL Transformations)的接口,是处理XML的基础工具集。XSLT用于转换XML文档,可以根据XSL样式表将XML转换为其他XML或HTML。 在Web服务方面,Java...
including full coverage of the SAX, DOM, StAX, JDOM, and dom4j APIs as well as the latest version of the Java API for XML Processing (JAXP) and Java Architecture for XML Binding (JAXB). The chapters ...
4. **JAXP(Java API for XML Processing)**:这是Java平台的XML处理框架,包括了SAX和DOM解析器的工厂接口,以及XPath处理器。通过JAXP,开发者可以灵活地选择不同的解析策略。 5. **StAX(Streaming API for XML...
此外,JAXP(Java API for XML Processing)提供了用于XML处理的接口,包括解析和样式表转换。 Spring框架是Java应用中的一个关键组件,它广泛使用XML配置文件来管理依赖注入和应用设置。通过XML配置,Spring可以...
JAXP(Java API for XML Processing)是Java平台上的XML处理标准,它提供了包括SAX在内的三种解析方式,即DOM(Document Object Model)、SAX和XSLT。本篇文章将深入探讨如何使用JAXP的SAX解析器来读取XML内容。 ...
在 Java 中使用 DOM 方式解析 XML 文件需要使用 JAXP(Java API for XML Processing),首先需要创建一个解析器工厂,然后使用工厂创建一个具体的解析器对象。然后,使用解析器对象来解析 XML 文件,得到一个 ...
5. JAXP(Java API for XML Processing):这是Java XML处理的基础框架,包括DOM、SAX和XSLT(XSL转换)的接口和实现。开发者可以通过JAXP的`TransformerFactory`和`Transformer`类来执行XML到XML的转换。 6. XML ...
Java API文档还涵盖了JDK中的其他重要组件,如JDBC(Java Database Connectivity)用于数据库操作,JAXP(Java API for XML Processing)用于XML处理,以及JNA(Java Native Access)用于调用本地操作系统API。...
5. JAXP(Java API for XML Processing):JAXP是Java平台上的XML处理API,它提供了处理XML的接口,包括解析器(用于读取XML文档)、Transformer(用于XSL转换)和Validator(用于验证XML文档)。JAXP使得Java开发者...
在Java中,可以使用JAXP(Java API for XML Processing)的DOM解析器来实现。 2. **SAX解析**:Simple API for XML(SAX)是一种事件驱动的解析方式,它不将整个XML文档加载到内存中,而是逐行读取,更适合处理大型...
5. JAXP(Java API for XML Processing):这是一个通用的接口,用于执行XML处理任务,如XSLT转换和XPath查询。 6. XSLT(可扩展样式表语言转换):用于将XML文档转换成其他格式,如HTML或PDF,常用于报表生成和...