Java解析XML之dom_sax方式
2015-09-17 20:59
453 查看
xml的语法
(1) 文档声明,第一行<?xml version=”1.0” encoding=”编码方式” standalone=”yes|no”?>
(2) 一个xml 文档中,有且只有一个根元素
(3) 属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)
特别说明: 如果属性值有单引号,有双引号,则需要使用实体。常用实体如下:
< < > > & & " " '
'
例如:<stu id="a"0'0'1">
(4) CDATA节
有时希望传递一些特殊字符, 例如 <>@!#$%^&*(
可以使用 CDATA节,基本用法:
<info><![CDATA[这个是好$$128qw8o8<Lk;>;akdf0sa98u329408><<K>>>学生]]></info>
dtd
基本概念: dtd ( document type definition,文档类型定义),该文件一般和xml文件配合使用, 主要的用处是约束 xml, 除了 dtd 技术外, 还有一个schema的技术也可以用于约束xml文件的书写规范.引入内部DTD文档
<!DOCTYPE 根元素 [定义内容]>
引入外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
其中引入本地 dtd : <!DOCTYPE 根元素 SYSTEM ‘地址’>
引入公共的 dtd : <!DOCTYPE 根元素 PUBLIC ‘地址’>
Java解析xml
dom方式1. dom会把xml全读入内存,形成dom树,占资源,不适合解析大的xml
2. dom适合做增、删、改、查操作
3.dom 会把xml文件中每一个元素 /属性/文本都映射成对应的Node对象/Element对象
示例:
default.xml
<?xml version="1.0" encoding="UTF-8"?> <groups> <stu id="001"> <name>zero001</name> <email>123@162.com</email> </stu> <stu id="002"> <name>zero002</name> <email>123@163.com</email> </stu> </groups>
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; 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; public class DomDemo { public static void main(String[] args) throws Exception { // write(); read(); } public static void write() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Element addresslist = doc.createElement("addresslist"); Element linkman = doc.createElement("linkman"); Element name = doc.createElement("name"); Element email = doc.createElement("email"); name.appendChild(doc.createTextNode("zero")); email.appendChild(doc.createTextNode("123@162.com")); linkman.appendChild(name); linkman.appendChild(email); addresslist.appendChild(linkman); doc.appendChild(addresslist); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); t.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult("my.xml"); t.transform(source, result); } public static void read() throws Exception { // 得到DocumentBuilderFactory --> 得到DocumentBuilder --> 指定文件 Document doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse("default.xml"); NodeList nodes = doc.getElementsByTagName("stu"); // stu的节点有2个 System.out.println(nodes.getLength()); for (int x = 0; x < nodes.getLength(); x++) { Element element = (Element) nodes.item(x); System.out.println("id = " + element.getAttribute("id")); System.out.println(element.getElementsByTagName("name").item(0) .getFirstChild().getNodeValue()); // System.out.println(element.getElementsByTagName("email").item(0) // .getFirstChild().getNodeValue()); System.out.println(element.getElementsByTagName("email").item(0) .getTextContent()); } } public static void modify() throws Exception { // 得到DocumentBuilderFactory --> 得到DocumentBuilder --> 指定文件 Document doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse("default.xml"); // 增 Element newStu = doc.createElement("stu"); newStu.setAttribute("id", "00x"); Element newStuName = doc.createElement("name"); newStuName.setTextContent("zero00x"); Element newStuEmail = doc.createElement("name"); newStuEmail.setTextContent("123@164.com"); newStu.appendChild(newStuName); newStu.appendChild(newStuEmail); doc.getDocumentElement().appendChild(newStu); //删 Element delStu = (Element) doc.getElementsByTagName("stu").item(0); delStu.removeAttribute("id"); delStu.getParentNode().removeChild(delStu); //改 Element updateStu = doc.createElement("stu"); updateStu.setAttribute("id", "00x"); updateStu.setTextContent("zero_00y"); //保存在文件中 TransformerFactory.newInstance().newTransformer() .transform(new DOMSource(doc), new StreamResult("default.xml")); } }sax方式
SAX解析是事件处理机制。只能读取xml文件,不能修改。
示例:
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXDemo { public static void main(String[] args) throws Exception { read(); } public static void read() throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); // 解析器 SAXParser parser = factory.newSAXParser(); parser.parse("default.xml", new MySAXHandler()); } } /** * 事件处理类 */ class MySAXHandler extends DefaultHandler { @Override public void characters(char[] ch, int start, int length) throws SAXException { // ch实际是文档本身,整个文档的char[] System.out.println("-----characters----"); String string = new String(ch, start, length); if ("".endsWith(string.trim())) { return; } System.out.println(string); } @Override public void endDocument() throws SAXException { System.out.println("-----endDocument----"); } @Override public void startDocument() throws SAXException { System.out.println("-----startDocument----"); } // uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 // localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 // qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 // attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("-----startElement----"); System.out.println("uri: " + uri); System.out.println("localName:" + localName); System.out.println("元素名称:" + qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("-----endElement----"); System.out.println("localName: " + localName); System.out.println("元素名称:" + qName); } }运行结果:
-----startDocument---- -----startElement---- uri: localName: 元素名称:groups -----characters---- -----startElement---- uri: localName: 元素名称:stu -----characters---- -----startElement---- uri: localName: 元素名称:name -----characters---- zero001 -----endElement---- localName: 元素名称:name -----characters---- -----startElement---- uri: localName: 元素名称:email -----characters---- 123@162.com -----endElement---- localName: 元素名称:email -----characters---- -----endElement---- localName: 元素名称:stu -----characters---- -----startElement---- uri: localName: 元素名称:stu -----characters---- -----startElement---- uri: localName: 元素名称:name -----characters---- zero002 -----endElement---- localName: 元素名称:name -----characters---- -----startElement---- uri: localName: 元素名称:email -----characters---- 123@163.com -----endElement---- localName: 元素名称:email -----characters---- -----endElement---- localName: 元素名称:stu -----characters---- -----endElement---- localName: 元素名称:groups -----endDocument----
相关文章推荐
- java解惑之常常忘记的事
- Struts2 入门3:Ognl表达式语言与struts标签
- struts入门实例总结
- Java执行命令行问题
- java(0)--初识java
- test4.3
- java读取excel中的多图片
- struts2基于注解的配置Demo
- java 泛型实例详解(普通泛型、 通配符、 泛型接口)
- test4.2
- java 不寻常的问题 No bean named 'sessionFactory' is defined 和 initialize a collection of role
- test4.1
- java基础-Map集合
- springmvc+log4j操作日志记录,详细配置
- Single Number --- 找出数组中出现一次的数字
- Java 输入一个数字将其转换为汉字,如:102,一百零二
- java File详解
- Java的开始?
- spring2.5 xml的简单入门示例(aop)
- java中的随机数Random