XML解析技术初探(一):DOM解析
2013-12-17 17:55
169 查看
xml解析技术分为两种:民间的 和 官方的。
民间的就是鼎鼎有名的SAX(Simple API for XML),是 XML 社区提供的标准,几乎所有的 XML 解析器都支持它。
官方的自然是权威机构W3C组织出台的DOM(Document ObjectModel)了,今天先初探下官方的技术。
根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),
DOM将整个页面映射为一个由层次节点组成的文件。
利用DOM解析xml就是找到节点,获取节点属性等等。有点类似于查找数据库的某条记录,从而获取某个记录的字段值。
而xml也经常用于存储数据,于是乎,咱们可以按照操作数据库对象的CRUD方式来操作xml文档:
<暂且利用j2se的JAXP(JavaAPIforXMLProcessing)对xml解析>
民间的就是鼎鼎有名的SAX(Simple API for XML),是 XML 社区提供的标准,几乎所有的 XML 解析器都支持它。
官方的自然是权威机构W3C组织出台的DOM(Document ObjectModel)了,今天先初探下官方的技术。
根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),
DOM将整个页面映射为一个由层次节点组成的文件。
利用DOM解析xml就是找到节点,获取节点属性等等。有点类似于查找数据库的某条记录,从而获取某个记录的字段值。
而xml也经常用于存储数据,于是乎,咱们可以按照操作数据库对象的CRUD方式来操作xml文档:
<暂且利用j2se的JAXP(JavaAPIforXMLProcessing)对xml解析>
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; 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.xml.sax.SAXException; public class OperateXML { private Document document; private String xmlPath; /** * 获取xml文档,类似于 数据库建立连接 * @param xmlPath xml文件的路径 * */ public void getXML(String xmlPath){ this.xmlPath = xmlPath; //1、创建工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //2、得到DOM解析器 try { DocumentBuilder builder = factory.newDocumentBuilder(); //3、解析xml文档,得到代表文档的document document = builder.parse(xmlPath); System.out.println("xml文档已经获取"); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } /** * 获取元素节点集合,类似于 数据库中具体某张表 * @param tagName:节点名,如:<book id="1" name="java"></book>中tagName="book"; * @return NodeList:节点集合,此处返回节点名称同为tagName的集合 * */ public NodeList getNodelist(String tagName){ return document.getElementsByTagName(tagName); } /** * 获取元素节点,类似于 数据库中具体某张表的某条记录 * @param attrName:表示属性名,类似于数据库字段名 * @param attrValue:表示属性值,类似于数据库字段值 * @param nodelist:节点集合 * @return Element:表示 XML 文档中的一个元素节点 * */ public Element getElt(String attrName, String attrValue,NodeList nodelist){ Element elt = null; for(int i=0; i<nodelist.getLength(); i++) { elt = (Element)nodelist.item(i);//Element实现了node接口,可以强转 if(elt.getAttribute(attrName).equals(attrValue)) break; else continue; } return elt; } /** * 获取节点元素的属性,类似于查找表中某条记录的字段值 * @param elt:元素节点 * @param attrName:所要查找的属性名 * @return String属性值 * */ public String getAttribute(Element elt,String attrName){ return elt.getAttribute(attrName); } /** * 修改节点属性值,类似于更新数据库字段值 * @param attrName:表示属性名,类似于数据库字段名 * @param attrValue:表示属性值,类似于数据库字段值 * @param elt:待修改属性的节点 * */ public void modifyElt(String attrName, String attrValue,Element elt){ elt.setAttribute(attrName, attrValue); //更新了内存中节点,需将内存中信息写回xml文档 toXmlFile(); } /** * 从xml中移除节点,类似于删除某条数据表记录 * @param elt:待删除的节点 * @param superElt:父节点 * */ public void removeElt(Element elt,Element superElt){ superElt.removeChild(elt); toXmlFile(); } /** * 新增一个节点,类似于数据表中新增一条记录 * @param tagName:表示节点名,类似于数据表 * @param attrNameArr:节点的属性名数组 * @param attrValueArr:节点的属性值数组,须跟attrNameArr的数组一一对应 * @param superElt:表示要往哪个节点中添加子节点,可以理解为往数据库添加表 * */ public void addElt(String tagName, String[] attrNameArr, String[] attrValueArr, Element superElt){ //创建一个节点 Element elt = document.createElement(tagName); //给节点赋予各种属性 for(int i=0; i<attrNameArr.length; i++) elt.setAttribute(attrNameArr[i], attrValueArr[i]);//属性的初始值设置为空 superElt.appendChild(elt); //更新了内存中节点,需将内存中信息写回xml文档 toXmlFile(); } /*** * 将更新的内存写回到xml文档 */ private void toXmlFile(){ try { TransformerFactory tffactory = TransformerFactory.newInstance(); Transformer tf; tf = tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream(xmlPath))); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } }
相关文章推荐
- XML解析技术和使用Jaxp对xml文档进行dom解析
- XML入门学习笔记之XML解析技术---DOM解析
- XML解析技术初探(二):DOM和SAX解析对比
- xml解析技术概述和使用Jaxp对xml文档进行dom解析
- Android实现XML解析技术
- Android实现XML解析技术
- java面向对象下:JavaXML解析技术
- XML解析技术
- 浅谈XML 解析技术(一)SAX解析
- xml解析之sax解析原理图和技术介绍
- android中的xml解析技术
- Java解析xml技术分析
- Android XML文档解析(二)——DOM解析
- 【Android】实现XML解析的几种技术
- XML解析技术研究(一)
- java 笔试题: xml 解析技术比较
- XML:使用DOM技术解析xML文件中的城市,实现select级联选择
- Java中四种XML解析技术
- Java中四种XML解析技术
- XML解析技术