Java解析XML之dom_sax方式

xml的语法

    (1)  文档声明,第一行
         <?xml version=”1.0” encoding=”编码方式”  standalone=”yes|no”?>
    (2)  一个xml 文档中,有且只有一个根元素
    (3)  属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)
         特别说明: 如果属性值有单引号,有双引号,则需要使用实体。常用实体如下:
         &lt;  <            &gt;  >           &amp;  &           &quot;  "            &apos;  '
         例如:<stu id="a&quot;0&apos;0&apos;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----





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值