1.XML编程
XML编程,就是对XML文件举行crud操纵。
那末为何要用java或许C/C++对XML举行crud操纵呢?
1.XML作为数据通报须要剖析
2.XML作为配置文件须要读取
3.XML作为小型数据库,须要举行crud操纵
w3C构造为了人人剖析XML轻易,定义了一套范例(API)
1.1.XML剖析手艺引见
1.XML剖析分为:dom剖析和sax剖析
dom:(Document Object Model,即文档对象模子),是W3C构造引荐的处置惩罚XML的一种体式格局
sax:(Simple API for XML),不是官方规范,但它是XML社区事实上的规范,险些一切的XML剖析器都支撑它
SAX剖析采纳事宜驱动模子边读边剖析:从上到下一行一行剖析,剖析到某一元素,挪用响应的剖析要领。
DOM依据XML层级构造在内存中分派一个树形构造,把XML的标签,属性和文本等元素都封装成树的节点对象。
差别的公司和构造供应了针对DOM和SAX两种体式格局的剖析器:
Sun的JAXP
Dom4j构造的dom4j(最经常运用,比方hibernate)
JDom构造的jdom
个中的JASP是J2SE的一部分,它离别针对DOM和SAX供应了DOM和SAX剖析器。
在这里也重要引见三种剖析:dom、sax和dom4j
1.2.JAXP引见
Sun公司供应了Java API for XML Parsing(JAXP)接口来运用SAX和DOM,经由过程JAXP,我们能够运用任何与JAXP兼容的XML剖析器。
JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包构成
在javax.xml.parsers包中,定义了几个工场类,程序员挪用这些工场类,能够取得对xml文档举行剖析的DOM或SAX的剖析器对象。
2.JAXP之DOM剖析
2.1.XML DOM节点树
起首申明JAXP剖析XML的DOM对象的道理,XML DOM把XML文档视为一颗节点树(node-tree),树中的一切节点彼此之间都有关联。可经由过程这棵树接见一切的节点。能够修正或许删除它们的内容,也能够建立新的元素。
比方,如今的XML文档以下(该例子来自w3cschool在线教程):
<bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book></bookstore>
这棵树从根节点最先,在树的最低层级向文本节点长出枝条:
【要知道的几个知识点】:
1.dom会把xml文件看作一棵树,并加载到内存
2.dom迥殊合适做crud操纵
3.dom不太合适去操纵比较大的xml文件(占用内存)
4.dom会把xml文件中每个元素、属性、文本都映照成对应的Node对象。
2.2.取得JAXP中的DOM剖析器步骤
1.挪用DocumentBuilderFactory.newInstance()要领取得建立DOM剖析器的工场
2.挪用工场对象的newDocumentBuilder要领取得DOM剖析器对象
3.挪用DOM剖析器对象的parse()要领剖析XML文档,取得代表全部文档的Document对象,举行能够运用DOM特征对全部XML文档举行操纵了。
2.3.JAXP之DOM剖析实例:
XML文档以下:
<?xml version="1.0" encoding="utf-8"?><班级> <门生 地点="香港"> <名字>周小星</名字> <岁数>23</岁数> <引见>进修受苦</引见> </门生> <门生 地点="澳门"> <名字>林晓</名字> <岁数>25</岁数> <引见>是一个好门生</引见> </门生> </班级>
2.3.1.读取XML文档
起首运用2.2中引见了三个步骤取得代表全部文档的document对象,并挪用我们所写的read(Document document)
要领,以下:
// 1.建立一个DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2.经由过程工场实例取得DocumentBuilder对象DocumentBuilder builder = factory.newDocumentBuilder(); // 3.指定要剖析的xml文件,返回document对象Document document = builder.parse(new File("src/myClass.xml")); read(document);
个中的read要领是这么写的:
/** * 显现一切门生的一切信息 * @param document */public static void read(Document document){ // 经由过程门生这个标签名字取得NodeList NodeList nodeList = document.getElementsByTagName("门生"); for(int i=0;i<nodeList.getLength();i++){ // 由于Element是Node的子接口,一切这里能够转换成Element // 从而能够运用更多的要领 Element student = (Element)nodeList.item(i); // 猎取属性 String address = student.getAttribute("地点"); System.out.println(address); // 取得门生的一切子节点,并轮回输出 NodeList childList = student.getChildNodes(); for(int j=0;j<childList.getLength();j++){ Node node = childList.item(j); if(node.getNodeType() == Node.ELEMENT_NODE) System.out.println(node.getNodeName()+":"+node.getTextContent()); } System.out.println("-------------"); } // 如许一层一层向下查询也能够 //Element name = (Element)student.getElementsByTagName("名字").item(0); //System.out.println(name.getTextContent()); }
末了的运转效果以下所示:
2.3.2.更新XML文档
运用DOM更新XML文档一定要运用Transformer类将变动写入文件,不然只是变动了在内存中的XML文档对象。
javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种花样后举行输出,比方把xml文件运用样式表后转成一个html文档。运用这个对象,固然也能够把Document对象又从新写回到一个XML文件中
Transformer类经由过程transform要领完成转换操纵,该要领吸收一个源和一个目的地。我们能够经由过程:
javax.xml.transform.dom.DOMSource类来关联要转换的document对象
用javax.xml.transform.stream.StreamResult对象来示意数据的目的地
Transformer对象经由过程TransformerFactory取得
【1】增加元素
我们能够向上述XML中增加一个门生子节点,以下:
/** * 增加门生 * * @param document * @throws Exception */public static void add(Document document) throws Exception { // 建立一个新的门生节点 Element newStudent = document.createElement("门生"); // 给新的门生增加地点属性 newStudent.setAttribute("地点", "旧金山"); // 建立门生的子节点 Element newStudent_name = document.createElement("名字"); newStudent_name.setTextContent("小明"); Element newStudent_age = document.createElement("岁数"); newStudent_age.setTextContent("25"); Element newStudent_intro = document.createElement("引见"); newStudent_intro.setTextContent("这是一个好孩子"); // 将子节点增加到门生节点上 newStudent.appendChild(newStudent_name); newStudent.appendChild(newStudent_age); newStudent.appendChild(newStudent_intro); // 把新的门生节点增加到根节点下 document.getDocumentElement().appendChild(newStudent); // 更新XML文档 // 取得TransformerFactory TransformerFactory tff = TransformerFactory.newInstance(); // 经由过程TransformerFactory取得一个转换器 Transformer tf = tff.newTransformer(); // 更新当前的XML文件 tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
【2】删除元素
一样的,我们也能够删除一个门生节点,以下:
/** * 删除第一个门生节点 * * @param document */public static void delete(Document document) throws Exception { // 起首找到这个门生,这里能够不必转为Element Node student = document.getElementsByTagName("门生").item(0); // 经由过程它的父节点来删除 student.getParentNode().removeChild(student); // 更新这个文档 TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
【3】变动元素的值
比方,我们也能够将第一个门生的名字改成松江,以下:
/** * 把第一个门生的元素名字改成宋江 * * @param document */public static void update_name(Document document) throws Exception{ Element student = (Element) document.getElementsByTagName("门生").item(0); Element name = (Element) student.getElementsByTagName("名字").item(0); name.setTextContent("宋江"); // 更新这个文档 TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
【4】变动或删除元素的属性
/** * 删除第一个门生节点的属性 * * @param document */public static void delete_attribute(Document document) throws Exception { // 起首找到这个门生 Element student = (Element) document.getElementsByTagName("门生").item(0); // 删除student的地点属性 student.removeAttribute("地点"); // 更新属性 // student.setAttribute("地点", "新地点"); // 更新这个文档 TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
上述列举了几个更新元素(节点)的例子,更平常的需求是如许的:将名字是周小星的同砚的岁数改成30,这时候我们须要去遍历XML文档,找到对应的节点,再举行修正。
别的,一切关于更新的要领中都用到了TransformerFactory来举行现实的更新,所以,我们能够把这三句话写成一个函数,从而防止代码冗余,以下:
public static void update(Document document, String path) throws Exception { TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File(path))); }
1.XML编程
XML编程,就是对XML文件举行crud操纵。
那末为何要用java或许C/C++对XML举行crud操纵呢?
1.XML作为数据通报须要剖析
2.XML作为配置文件须要读取
3.XML作为小型数据库,须要举行crud操纵
w3C构造为了人人剖析XML轻易,定义了一套范例(API)
1.1.XML剖析手艺引见
1.XML剖析分为:dom剖析和sax剖析
dom:(Document Object Model,即文档对象模子),是W3C构造引荐的处置惩罚XML的一种体式格局
sax:(Simple API for XML),不是官方规范,但它是XML社区事实上的规范,险些一切的XML剖析器都支撑它
SAX剖析采纳事宜驱动模子边读边剖析:从上到下一行一行剖析,剖析到某一元素,挪用响应的剖析要领。
DOM依据XML层级构造在内存中分派一个树形构造,把XML的标签,属性和文本等元素都封装成树的节点对象。
差别的公司和构造供应了针对DOM和SAX两种体式格局的剖析器:
Sun的JAXP
Dom4j构造的dom4j(最经常运用,比方hibernate)
JDom构造的jdom
个中的JASP是J2SE的一部分,它离别针对DOM和SAX供应了DOM和SAX剖析器。
在这里也重要引见三种剖析:dom、sax和dom4j
1.2.JAXP引见
Sun公司供应了Java API for XML Parsing(JAXP)接口来运用SAX和DOM,经由过程JAXP,我们能够运用任何与JAXP兼容的XML剖析器。
JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包构成
在javax.xml.parsers包中,定义了几个工场类,程序员挪用这些工场类,能够取得对xml文档举行剖析的DOM或SAX的剖析器对象。
2.JAXP之DOM剖析
2.1.XML DOM节点树
起首申明JAXP剖析XML的DOM对象的道理,XML DOM把XML文档视为一颗节点树(node-tree),树中的一切节点彼此之间都有关联。可经由过程这棵树接见一切的节点。能够修正或许删除它们的内容,也能够建立新的元素。
比方,如今的XML文档以下(该例子来自w3cschool在线教程):
<bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web" cover="paperback"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book></bookstore>
这棵树从根节点最先,在树的最低层级向文本节点长出枝条:
【要知道的几个知识点】:
1.dom会把xml文件看作一棵树,并加载到内存
2.dom迥殊合适做crud操纵
3.dom不太合适去操纵比较大的xml文件(占用内存)
4.dom会把xml文件中每个元素、属性、文本都映照成对应的Node对象。
2.2.取得JAXP中的DOM剖析器步骤
1.挪用DocumentBuilderFactory.newInstance()要领取得建立DOM剖析器的工场
2.挪用工场对象的newDocumentBuilder要领取得DOM剖析器对象
3.挪用DOM剖析器对象的parse()要领剖析XML文档,取得代表全部文档的Document对象,举行能够运用DOM特征对全部XML文档举行操纵了。
2.3.JAXP之DOM剖析实例:
XML文档以下:
<?xml version="1.0" encoding="utf-8"?><班级> <门生 地点="香港"> <名字>周小星</名字> <岁数>23</岁数> <引见>进修受苦</引见> </门生> <门生 地点="澳门"> <名字>林晓</名字> <岁数>25</岁数> <引见>是一个好门生</引见> </门生> </班级>
2.3.1.读取XML文档
起首运用2.2中引见了三个步骤取得代表全部文档的document对象,并挪用我们所写的read(Document document)
要领,以下:
// 1.建立一个DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2.经由过程工场实例取得DocumentBuilder对象DocumentBuilder builder = factory.newDocumentBuilder(); // 3.指定要剖析的xml文件,返回document对象Document document = builder.parse(new File("src/myClass.xml")); read(document);
个中的read要领是这么写的:
/** * 显现一切门生的一切信息 * @param document */public static void read(Document document){ // 经由过程门生这个标签名字取得NodeList NodeList nodeList = document.getElementsByTagName("门生"); for(int i=0;i<nodeList.getLength();i++){ // 由于Element是Node的子接口,一切这里能够转换成Element // 从而能够运用更多的要领 Element student = (Element)nodeList.item(i); // 猎取属性 String address = student.getAttribute("地点"); System.out.println(address); // 取得门生的一切子节点,并轮回输出 NodeList childList = student.getChildNodes(); for(int j=0;j<childList.getLength();j++){ Node node = childList.item(j); if(node.getNodeType() == Node.ELEMENT_NODE) System.out.println(node.getNodeName()+":"+node.getTextContent()); } System.out.println("-------------"); } // 如许一层一层向下查询也能够 //Element name = (Element)student.getElementsByTagName("名字").item(0); //System.out.println(name.getTextContent()); }
末了的运转效果以下所示:
2.3.2.更新XML文档
运用DOM更新XML文档一定要运用Transformer类将变动写入文件,不然只是变动了在内存中的XML文档对象。
javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种花样后举行输出,比方把xml文件运用样式表后转成一个html文档。运用这个对象,固然也能够把Document对象又从新写回到一个XML文件中
Transformer类经由过程transform要领完成转换操纵,该要领吸收一个源和一个目的地。我们能够经由过程:
javax.xml.transform.dom.DOMSource类来关联要转换的document对象
用javax.xml.transform.stream.StreamResult对象来示意数据的目的地
Transformer对象经由过程TransformerFactory取得
【1】增加元素
我们能够向上述XML中增加一个门生子节点,以下:
/** * 增加门生 * * @param document * @throws Exception */public static void add(Document document) throws Exception { // 建立一个新的门生节点 Element newStudent = document.createElement("门生"); // 给新的门生增加地点属性 newStudent.setAttribute("地点", "旧金山"); // 建立门生的子节点 Element newStudent_name = document.createElement("名字"); newStudent_name.setTextContent("小明"); Element newStudent_age = document.createElement("岁数"); newStudent_age.setTextContent("25"); Element newStudent_intro = document.createElement("引见"); newStudent_intro.setTextContent("这是一个好孩子"); // 将子节点增加到门生节点上 newStudent.appendChild(newStudent_name); newStudent.appendChild(newStudent_age); newStudent.appendChild(newStudent_intro); // 把新的门生节点增加到根节点下 document.getDocumentElement().appendChild(newStudent); // 更新XML文档 // 取得TransformerFactory TransformerFactory tff = TransformerFactory.newInstance(); // 经由过程TransformerFactory取得一个转换器 Transformer tf = tff.newTransformer(); // 更新当前的XML文件 tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
【2】删除元素
一样的,我们也能够删除一个门生节点,以下:
/** * 删除第一个门生节点 * * @param document */public static void delete(Document document) throws Exception { // 起首找到这个门生,这里能够不必转为Element Node student = document.getElementsByTagName("门生").item(0); // 经由过程它的父节点来删除 student.getParentNode().removeChild(student); // 更新这个文档 TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
【3】变动元素的值
比方,我们也能够将第一个门生的名字改成松江,以下:
/** * 把第一个门生的元素名字改成宋江 * * @param document */public static void update_name(Document document) throws Exception{ Element student = (Element) document.getElementsByTagName("门生").item(0); Element name = (Element) student.getElementsByTagName("名字").item(0); name.setTextContent("宋江"); // 更新这个文档 TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
【4】变动或删除元素的属性
/** * 删除第一个门生节点的属性 * * @param document */public static void delete_attribute(Document document) throws Exception { // 起首找到这个门生 Element student = (Element) document.getElementsByTagName("门生").item(0); // 删除student的地点属性 student.removeAttribute("地点"); // 更新属性 // student.setAttribute("地点", "新地点"); // 更新这个文档 TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File( "src/myClass.xml"))); }
上述列举了几个更新元素(节点)的例子,更平常的需求是如许的:将名字是周小星的同砚的岁数改成30,这时候我们须要去遍历XML文档,找到对应的节点,再举行修正。
别的,一切关于更新的要领中都用到了TransformerFactory来举行现实的更新,所以,我们能够把这三句话写成一个函数,从而防止代码冗余,以下:
public static void update(Document document, String path) throws Exception { TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new File(path))); }
以上就是XML—XML剖析之DOM的内容,更多相关内容请关注ki4网(www.ki4.cn)!