`
tzq668766
  • 浏览: 79197 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

如何使用Java解析XML

阅读更多

XML_day01_pm
1.XML可宽展编辑语言
  指令:帮助解析文件解析指定信息
  1.页面注释:顶格写;
  2.标记必须是成对的;
  3.根元素只能有一个;
  4.元素的属性必须出现在起始标记里;
  5.属性必须有值,且属性值必须加引号“”;
  6.元素可以有子元素(或说成元素可以有子元素);
  7.元素不能交叉;
  8.元素体中可以有文本(非解析文本);
 
 

2.什么是DTD(XML元素说明文件)
3.DTD中内容说明:
标签<ELEMENT>的作用:对某元素的元素体进行说明;
#PCDATA-》可解析的字符信息;

XML_Schema_day_01_am
1.什么是Schema(计划):schema是一种基于xml的类dtd,他描述了xml文件的架构,XML Schema也是指XML Schema 定义(.xsd),xml的目的在于定义一个合法的创建xml文档块,类似于DTD.
2.命名空间:DTD不支持命名空间,而Schema(.xsd)支持命名空间;
命名空间定义句型:xmlns:prefix=”URL”,如:
<books:book xmlns=:books='http://www.library.com/books'>
  <books:title>this book</books:title>
</books:book>
3.Schema的元素:
    a.简单元素--》只包含文本的元素;
    句型:<xs:element name=”xxx” type=”yyy”/>
    schema中有很多内置的type
    type常用类型:xs:string   xs:decimal  xs:integer xs:boolean xs:date xs:time
    如,<xs:element name=”price” type=”xs:double”/>
        属性默认是可选的:
        <xs:element name=”price”type=”xs:double” default=”10”/>
        <xs:element name=”price” type=”xs:double” use=”required”/>


   简单类型(元素体类型,不包括属性声明)定义的实例:
  <xs:simpleType name=”myType”>
     <xs:restriction base=”xs:integer”>//整数上加一个范围的约束[0,120]
       <xs:minInclusive value=”0”/>
       <xs:maxInclusive value=”120”/>
    </xs:restriction>
  </xs:simpleType>
  复杂类型实例(元素体类型,包括属性的声明):
  <xs:schema  xmlns:xs='http://www.w3.org/2001/XMLSchema'>
    <xs:element name=”quantity”>
       <xs:simpleContent>
        <xs:extension base='xs:nonNegativeInteger'>//基于无非负整数的扩展
           <xs:attribute name='backorderable'  type='xs:boolean' default='false'/>
         </xs:extension>
       </xs:simpleContent>
    </xs:element>
  </xs:schema>

利用上述schema控制的有效的xml片段:
<quantity backorderable='true'>1</quantity>
无效的片段:
<quantity orderable='true'>2</quantity>

 

4.         Xpath和Parsers(解析器)
 


       
   





                                  图 SAX 操作模型


5.JDK中xml解析器SAX所在的包:javax.xml.parsers.*:
javax.xml.parsers.SAXParser类的常用方法:
public void parse(InputSource is, DefaultHandler dh)  throws SAXException,  IOException
使用指定的 DefaultHandler 将给定 InputSource 的内容解析为 XML。
    参数: is - 包含要解析内容的 InputSource。 dh - 要使用的 SAX DefaultHandler。
      抛出:
        IllegalArgumentException - 如果 InputSource 对象为 null。
        IOException - 如果发生任何 IO 错误。
        SAXException - 如果在处理过程中发生任何 SAX 错误。
    另请参见:
        DocumentHandler


一个SAXParser类的实例:
package tang.xml.parser;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler extends DefaultHandler {

public void startDocument()throws SAXException{
System.out.println("document started...");
}
public void endDocument()throws SAXException{
System.out.println("document ended....");
}
}

package tang.xml.parser;

import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class MyHanlderParser {

/**
*解析xml文件的解析器测试
*/
public static void main(String[] args) throws Exception {
InputStream in = null;
SAXParser parser = null;
SAXParserFactory fac = SAXParserFactory.newInstance();
in = new FileInputStream(
"/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml");
parser = fac.newSAXParser();
parser.parse(in, new MyHandler());
in.close();
}

}
结果:
document started...
document ended....
<?xml version="1.0" encoding="UTF-8"?>
<!-- books.xml contents -->
<books>
<book id="b001">
  <name>xiaohua</name>
   <authuor>tangzhiqiang</authuor>
   <title>Java</title>
   <price>10.1</price>
</book>
<book id="b002">
<name>bingb</name>
<authuor>tangyi</authuor>
<title>HTML</title>
<price>sheng</price>
</book>
</books>







                             
XML_Schema_day_01_pm
1.xml解析的完整实例:
读取xml文件的实现类
package tang.xml.parser;

import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class MyHandler extends DefaultHandler {

// 获取标签中的数据
public void characters(char[] c, int start, int length) throws SAXException {
System.out.print(new String(c, start, length));
}

// 获得起始标签
public void startElement(String uri, String loacleName, String qName,
Attributes attrs) {
StringBuffer sb = new StringBuffer();
sb.append("<" + qName + " ");//取得起始元素名称
//通过循环获得标签的属性(可能有多个属性)
for (int i = 0; i < attrs.getLength(); i++) {
sb.append(attrs.getQName(i) + "=");//获得属性名
sb.append("'" + attrs.getValue(i) + "'");//获得属性值
}
sb.append(">");
System.out.print(sb.toString());
}

// 获得结束标签
public void endElement(String uri, String localeName, String qName) {
StringBuffer sb = new StringBuffer();
sb.append("</" + qName + ">"); //获得标签后缀名称
System.out.print(sb);
}

// 开始读文件
public void startDocument() throws SAXException {
System.out.println("document started...");
}

// 结束读文件
public void endDocument() throws SAXException {
System.out.println("document ended....");
}
}
调用解析器的主类

package tang.xml.parser;

import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class MyHanlderParser {

/**
*解析xml文件的解析器测试
*/
public static void main(String[] args) throws Exception {
InputStream in = null;
SAXParser parser = null;
SAXParserFactory fac = SAXParserFactory.newInstance();

in = new FileInputStream(
"/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml");
parser = fac.newSAXParser();
parser.parse(in, new MyHandler());

in.close();

}

}
读取的结果:
document started...
<books >
<book id='b001'>
  <name >xiaohua</name>
   <authuor >tangzhiqiang</authuor>
   <title >Java</title>
   <price >10.1</price>
</book>
<book id='b002'>
  <name >bingb</name>
  <authuor >tangyi</authuor>
  <title >HTML</title>
  <price >sheng</price>
</book>
</books>document ended....

2.DOM in Action
 
  





                            图- DOM模型图
DOM的缺点:比较占内存;
           
DOM操作所用到的类包org.w3c.dom.*;
   org.w3c.dom.DocumentBuilderFactory
   org.w3c.dom.DocumentBuilder
   org.w3c.dom.Document
   对象生成顺序:
  
   org.w3c.dom.Node类常用方法:getXXX()/setXXX()
                             getFirstChild()获得根节点
                             getLastChild()获得最后一个节点
                             getNextSibling()获得兄弟节点
   org.w3c.dom.Document类
   org.w3c.dom.Element类 常用方法getElementsByTagName(String name)
                                getAttribute(String name);
                               
使用DOM的实例:
package tang.xml.parser;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;



public class MyDocumentLab {

/**
* DOM模型实例
*/
public static void main(String[] args) {
        FileInputStream in=null;
Document doc=null;
DocumentBuilder builder=null;
DocumentBuilderFactory fac=null;
fac=DocumentBuilderFactory.newInstance();
try {
//获得Document对象
builder=fac.newDocumentBuilder();
in=new FileInputStream("/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml");
doc=builder.parse(in);

//获得Element对象
StringBuffer sb=new StringBuffer();
Element root=doc.getDocumentElement();
sb.append(root.getNodeName()+"\n");
sb.append(root.getTagName());
System.out.println(sb);

} catch (ParserConfigurationException e) {
e.printStackTrace();
}catch (FileNotFoundException e){
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

}
结果:
books
books
使用DOM获取<book>标签的内容
package tang.xml.parser;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class MyDocumentLab2 {

/**
* @param args
*/
public static void main(String[] args) {

FileInputStream fis=null;
Document doc=null;
DocumentBuilder builder=null;
DocumentBuilderFactory fac=null;

fac=DocumentBuilderFactory.newInstance();
try {
builder=fac.newDocumentBuilder();
fis=new FileInputStream("/home/soft01/jdbcproject/day05/src/tang/xml/parser/books.xml");
doc=builder.parse(fis);


//StringBuffer sb=new StringBuffer();
NodeList nl=doc.getElementsByTagName("book");
for(int i=0;i<nl.getLength();i++){
Element e=(Element)nl.item(i);
System.out.println(processElement(e));
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static String processElement(Element e){
StringBuffer sb=new StringBuffer();
sb.append("<"+e.getTagName());
NamedNodeMap map=e.getAttributes();
for(int i=0;i<map.getLength();i++){
Node attr=map.item(i);
String nodeName=attr.getNodeName();
String nodeValue=attr.getNodeValue();
sb.append(" "+nodeName+"='");
//System.out.println(nodeName+"->"+nodeValue);
sb.append(nodeValue+"'");
}
sb.append(">");
//处理子元素
NodeList children=e.getChildNodes();
for(int i=0;i<children.getLength();i++){
Node child=children.item(i);
String childName=child.getNodeName();
String childValue=child.getNodeValue();
//System.out.println(childName+"->"+childValue);

if(child.getNodeType()==Node.ELEMENT_NODE){
sb.append(processElement((Element)child));//如果是元素节点则递归调用
//System.out.println(child.getNodeName());
}else if(child.getNodeType()==Node.TEXT_NODE){
//sb.append(child.getTextContent());//如果是文本节点则获得文本
sb.append(((Text)child).getWholeText());
// System.out.println(((Text)child).getWholeText());
}

}
sb.append("</"+e.getTagName()+">");
return sb.toString();
}


// private static String processElement(Element e){
// StringBuffer sb = new StringBuffer();
// sb.append("<"+e.getTagName());
// NamedNodeMap attrs = e.getAttributes();
// for(int i=0;i<attrs.getLength();i++){
//   Node attr = attrs.item(i);
//   sb.append("  "+attr.getNodeName()+"=");
//   sb.append(attr.getNodeValue());
// }
// sb.append(">");
// NodeList children = e.getChildNodes();
// for(int i=0;i<children.getLength();i++){
// Node child = children.item(i);
// if(child.getNodeType()==Node.ELEMENT_NODE){
//    sb.append(processElement((Element)child));
// }else if(child.getNodeType()==Node.TEXT_NODE){
// sb.append(((Text)child).getWholeText());
// }
// }
// sb.append("</"+e.getTagName()+">");
// return sb.toString();
// }
}
结果:
<book id='b001'>
  <name>xiaohua</name>
  <authuor>tangzhiqiang</authuor>
  <title>Java</title>
  <price>21.6</price>
  <count>100</count>
</book>
<book id='b002'>
  <name>bingb</name>
  <authuor>tangyi</authuor>
  <title>HTML</title>
  <price>10</price>
  <count>200</count>
</book>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics