您的位置:首页 > 编程语言 > Java开发

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----
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: