一.概要
用Java解析XML文档,最常用的有两种方式:使用基于事件的XML简单API(Smiple API for XML)称为SAX和基于树和节点的文档对象模型(Document object Module)成为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口
(2)org.xml.sax 用于对XML进行语法分析的事情驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
二.实例
1.所需xml 文件
Test.xml
- <? xml version = "1.0" encoding = "UTF-8" ?>
- < books >
- < book email = "zeh2007@126.com" >
- < name > C++编程思想 </ name >
- < price > 60.0 </ price >
- </ book >
- </ books >
students.xml
- <? xml version = "1.0" encoding = "gb2312" ?>
- <? xml -stylesheet type = "text/xsl" href = "students.xsl" ?>
- < students >
- < student sn = "04378066" >
- < name > ldz </ name >
- < age > 23 </ age >
- </ student >
- < student sn = "04378069" >
- < name > zeh </ name >
- < age > 21 </ age >
- </ student >
- </ students >
2.将xml 文件转化为dom :
- public class DOMConvert {
- public static void main(String[] args) {
- //DOM 解析器的工厂实例
- DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
- try {
- //从DOM 工厂获得DOM 解析器
- DocumentBuilder db=dbf.newDocumentBuilder();
- //解析XML 文档的输入流,得到一个 Document
- Document doc=db.parse( new File( "xmlFil/students.xml " ));
- //建立一个XML 节点
- Element eltStu=doc.createElement( "student" );
- Element eltName=doc.createElement( "name" );
- Element eltAge=doc.createElement( "age" );
- Text textName=doc.createTextNode( "yyr" );
- Text textAge=doc.createTextNode( "22" );
- eltName.appendChild(textName);
- eltAge.appendChild(textAge);
- eltStu.appendChild(eltName);
- eltStu.appendChild(eltAge);
- eltStu.setAttribute( "sn" , "04378072" );
- //将此节点插入根的孩子中
- Element root=doc.getDocumentElement();
- root.appendChild(eltStu);
- //获取stuent标签节点
- NodeList nl=root.getElementsByTagName( "student" );
- //删除第一个节点
- root.removeChild(nl.item( 0 ));
- //获取第一个节点
- Element eltStuChg=(Element)nl.item( 0 );
- //获取age标签节点
- Node nodeAgeChg=eltStuChg.getElementsByTagName( "age" ).item( 0 );
- nodeAgeChg.getFirstChild().setNodeValue( "20" );
- int len=nl.getLength();
- for ( int i= 0 ;i
- Element elt=(Element)nl.item(i);
- System.out.println( "编号:" + elt.getAttribute( "sn" ));
- Node nodeName=elt.getElementsByTagName( "name" ).item( 0 );
- Node nodeAge=elt.getElementsByTagName( "age" ).item( 0 );
- String name=nodeName.getFirstChild().getNodeValue();
- String age=nodeAge.getFirstChild().getNodeValue();
- System.out.println( "姓名:" +name);
- System.out.println( "年龄:" + age);
- System.out.println( "--------------------" );
- }
- //实例化一个转换工厂
- TransformerFactory tff=TransformerFactory.newInstance();
- //获取一个转换实例
- Transformer tf=tff.newTransformer();
- //设置输出属性
- tf.setOutputProperty( "encoding" , "gb2312" );
- //根据Document对象新建一个DOM 数 据源
- DOMSource source= new DOMSource(doc);
- //定义输出流
- StreamResult result= new StreamResult( new File( "convert.xml " ));
- //从数据源转换至输出流
- tf.transform(source,result);
- }
- catch (ParserConfigurationException e) {
- e.printStackTrace();
- }
- catch (SAXException e) {
- e.printStackTrace();
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- catch (TransformerConfigurationException e) {
- e.printStackTrace();
- }
- catch (TransformerException e) {
- e.printStackTrace();
- }
- }
- }