JAXP(Java API for XMLProcessing)知识总结
来源:互联网 发布:用js触发a标签的href 编辑:程序博客网 时间:2024/04/29 14:12
XML的解析
1.xml解析方式
DOM方式:Document Object Model,文档对象模型,W3C推荐的使用方式。
SAX方式:Simple API for XML,不是官方标准,但是属于开源社区XML-DEV,几乎所有的XML解析器都支持。
2.xml解析开发包
JAXP:SUN公司推出的解析标准实现。
Dom4J:Dom4J开源社区提供的解析开发包(sun公司的一些技术实现都在使用,使用广泛)。
JDom:开源组织提供的开发包。
JAXP解析开发包
1.jaxp的api
jaxp是javase的一部分
jaxp解析器主要在javax.xml.parsers包内定义
下分为4个类
dom:1.DocumentBuilder解析器类 1.抽象类 2.该类实例可以通过DocumentBuilderFactory.newDocumentBuilder()方法获取。 3.通过parsers("xml文件路径");解析xml文件,返回Document整个文档。 4.Document为接口,父接口为Node。 5.Document中的方法getElementsByTagname(String Tagname)可以得到xml中的标签名,返回NodeList集合 6.createElement(String tagname);创造标签 7.createTextNode(Strig text);创造文本节点 8.和js中一样,可以使用appendChild(Node s); removeChild(Node s); replaceChild(Node new,Node old);方法,具体可以查看api 9.NodeList的方法:getLength();得到集合长度。item(int x);返回在x处的元素,返回值为Node。2.DocumentBuilderFactory解析器工厂 抽象类 可以通过newInstance获取实例sax:3.SaxParsers解析器类4.SaxParsersFactory解析器工厂
2.jaxp实例
1.解析一个xml文件
xml文件盒java文件在同一个包内,my.package
xml文件(路径src/my/2.xml),现在需要查询xml文件中name标签的值
<?xml version="1.0" encoding="UTF-8"?><person> <p1> <name>SS1</name> <age>20</age> </p1> <p1> <name>SS2</name> <age>21</age> </p1></person>
java文件(路径src/my/JAXP.java)
package my;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.NodeList;public class JAXP { public static void main(String args[]) throws Exception { DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder(); Document document=documentbuilder.parse("src/my/2.xml"); NodeList nodelist=document.getElementsByTagName("name"); for(int i=0;i<nodelist.getLength();i++) { System.out.println("name="+nodelist.item(i).getTextContent());//getTextContent()得到标签里内容 } }}
运行后得到name标签的值
通过上例可以看出,想要解析一个xml文件,并查询标签信息,需要几个步骤
1.通过DocumentBuilderFactory.newInstance();方法创建DocumentBuilderFactory 对象。
2.通过DocumentBuilderFactory 对象.newDocumentBuilder();方法创建DocumentBuilder 对象。
3.通过DocumentBuilder 对象.parse(“xml文件路径”);方法创建Document 对象。
4.通过Document 对象.getElementsByTagName(“标签名”);方法创建NodeList 对象。
5.通过NodeList 对象.getLength();方法遍历Node元素,并通过NodeList 对象.item(i)方法获得所需的Node对象,再通过相应方法查询标签信息(比如Node对象.getTextContent()获取标签内容)。
2.给xml文件添加一个标签
假设实现效果为在1中的xml文件中每个人的信息都添加一个<sex>...</sex>
标签
xml原文件(路径src/my/2.xml)
<?xml version="1.0" encoding="UTF-8"?><person> <p1> <name>SS1</name> <age>20</age> </p1> <p1> <name>SS2</name> <age>21</age> </p1></person>
java文件(路径src/my/JAXP.java)
package my;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;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.NodeList;import org.w3c.dom.Text;import org.xml.sax.SAXException;public class JAXP { public static void main(String args[]) throws Exception { add(); } private static void add() throws Exception{ DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder(); Document document=documentbuilder.parse("src/my/2.xml"); NodeList nodelist=document.getElementsByTagName("p1"); String [] sex={"男","女"}; for(int i=0;i<nodelist.getLength();i++) { Element s1=document.createElement("sex"); Text s2=document.createTextNode(sex[i]); s1.appendChild(s2); nodelist.item(i).appendChild(s1); } //因为解析xml的机制是先在内存中开辟一块内存,用来存放xml的解析树,所以现在修改的还只是内存中的xml解析树,实际上对实际的xml原文件没有进行修改, //所以需要将内存中修改过的xml回写进文件,才能实现原文件的修改 TransformerFactory transformerfatory=TransformerFactory.newInstance(); Transformer transformer=transformerfatory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml")); }}
修改后的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>SS1</name> <age>20</age> <sex>男</sex></p1> <p1> <name>SS2</name> <age>21</age> <sex>女</sex></p1></person>
3.修改xml文件
将2中添加标签后的xml文件的sex标签内容修改掉
xml修改前(scr/my/2.xml),将sex标签中的男女值对调
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>SS1</name> <age>20</age> <sex>男</sex></p1> <p1> <name>SS2</name> <age>21</age> <sex>女</sex></p1></person>
java文件
package my;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;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.NodeList;import org.w3c.dom.Text;import org.xml.sax.SAXException;public class JAXP { public static void main(String args[]) throws Exception { changeSex(); } private static void changeSex() throws Exception{ DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder(); Document document=documentbuilder.parse("src/my/2.xml"); NodeList nodelist=document.getElementsByTagName("sex"); String [] sex={"女","男"}; for(int i=0;i<nodelist.getLength();i++) { nodelist.item(i).setTextContent(sex[i]); } //回写xml TransformerFactory transformerfatory=TransformerFactory.newInstance(); Transformer transformer=transformerfatory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml")); }}
修改后的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>SS1</name> <age>20</age> <sex>女</sex></p1> <p1> <name>SS2</name> <age>21</age> <sex>男</sex></p1></person>
4.删除xml中的标签
将3中的xml文件中的sex标签删去
删除前的xml文件(scr/my/2.xml)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>SS1</name> <age>20</age> <sex>女</sex></p1> <p1> <name>SS2</name> <age>21</age> <sex>男</sex></p1></person>
java文件
package my;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;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;import org.w3c.dom.Text;import org.xml.sax.SAXException;public class JAXP { public static void main(String args[]) throws Exception { deleteSex(); } private static void deleteSex() throws Exception{ DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder(); Document document=documentbuilder.parse("src/my/2.xml"); NodeList nodelist=document.getElementsByTagName("p1"); for(int i=0;i<nodelist.getLength();i++) {// Node parent=nodelist.item(i).getParentNode(); nodelist.item(i).removeChild(nodelist.item(i).getLastChild()); } //回写xml TransformerFactory transformerfatory=TransformerFactory.newInstance(); Transformer transformer=transformerfatory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml")); }}
删除sex标签的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>SS1</name> <age>20</age></p1> <p1> <name>SS2</name> <age>21</age> </p1></person>
对xml的元素进行遍历
xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person> <p1> <name>SS1</name> <age>20</age></p1> <p1> <name>SS2</name> <age>21</age> </p1></person>
java文件
package my;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;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;import org.w3c.dom.Text;import org.xml.sax.SAXException;public class JAXP { public static void main(String args[]) throws Exception { listElement(); } private static void listElement() throws Exception{ DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder(); Document document=documentbuilder.parse("src/my/2.xml");// Node node=document;// NodeList nodelist=node.getChildNodes();//得到一层子节点(在这里就是xml的根节点了) getNode(document,0); } private static void getNode(Node node,int n) { NodeList nodelist=node.getChildNodes(); for(int i=0;i<nodelist.getLength();i++) { for(int j=0;j<n;j++) { System.out.print(" "); } if(nodelist.item(i).getNodeType()==Node.ELEMENT_NODE) { System.out.println(nodelist.item(i).getNodeName()); getNode(nodelist.item(i),n+1); } } }}
控制台输出
person p1 name age p1 name age
- JAXP(Java API for XMLProcessing)知识总结
- JAXP(Java API for XML Parsing)
- Java API for XML Parsing(JAXP)演进
- JAXP(Java API for XML Parsing)
- JAXP(Java API for XML Parsing)
- JAXP-Java API for XML Processing
- XML:JAXP(Java API for XML Processing)处理XML的添CRUD(DOM方式)
- JSR 206: Java API for XML Processing (JAXP) 1.3
- C++, Java, & XMLProcessing
- JAXP:(Java API for XML Processing)DOM方式解析XML文件
- Java知识总结-for循环
- Java For Android常用知识总结1
- Java for XML: JAXP、JAXB、JAXM、JAX-RPC、JAX-WS
- xml 相关知识及xml解析(jaxp)
- java知识总结(2)
- java知识总结(4)
- java知识总结(5)
- java知识总结(6)
- IOS项目上架流程
- C++ 静态全局变量与普通全局变量
- java.io.IOException: Stream closed解决办法
- Ubuntu14.04安装GNOME3桌面
- vs2012 应用程序无法正常启动 (0xc0150002)
- JAXP(Java API for XMLProcessing)知识总结
- 冒泡排序
- windows平台select单socket多次通信
- css代码标准化规范
- 简介
- ViewPager 入门一
- ORACLE批量更新三种方法比较
- 42. Element hasChildNodes() 方法
- FIS 前端发布打包(入门)