`
tzq668766
  • 浏览: 81168 次
  • 性别: 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>

分享到:
评论

相关推荐

    使用java解析XML文件,解析完之后将解析结果导入mysql数据库中

    本教程将介绍如何使用Java解析XML文件,并将解析结果导入MySQL数据库。 首先,我们需要引入处理XML的Java库——JAXB(Java Architecture for XML Binding)和DOM(Document Object Model)API。JAXB用于对象与XML...

    使用java解析XML

    本文将深入探讨如何使用Java来解析XML,以便更好地理解和操作XML文档。 首先,Java提供了多种解析XML的方式,包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。每种...

    JAVA 解析XML生成XML文档实例

    JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    java教材-使用Java解析XML(IT jb就业培训).doc

    java教材-使用Java解析XML(IT jb就业培训).doc

    Java 解析xml 存入mongodb 返回org.json json包

    本篇将详细介绍如何使用Java解析XML,将数据存入MongoDB,并返回org.json JSON包。 首先,解析XML通常有两种主要方法:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个XML文档到内存...

    java 解析xml 多级

    Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细讲解如何在Java中解析XML,特别是针对多级结构的情况。 首先,Java提供了两种主要的API来处理XML:...

    java xml解析工具类 java xml解析工具类

    java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    java解析xml字符串

    ### Java解析XML字符串 在给定的代码示例中,我们看到了如何使用JDOM库来解析一个XML字符串,并对其进行操作。下面我们将详细解析这个过程: 1. **初始化XML源**:首先,将XML字符串转化为`StringReader`对象,这...

    java 解析XML修改路径值

    本篇文章将详细讲解如何使用Java解析XML文件,并修改其中的特定路径值。 首先,我们需要了解Java中解析XML的两个主要库:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个XML文档到...

    java解析XML文件

    Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种结构化数据存储格式,被广泛用于数据交换、配置文件和Web服务等场景。本篇文章将详细探讨Java如何利用DOM4J库来解析XML文件...

    JAVA 解析xml

    JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法

    java解析xml及4种常用解析比较

    因此,掌握如何使用Java解析XML是非常必要的技能。本文将详细介绍Java中四种常用的XML解析技术:SAX、DOM、StAX以及JAXB,并对它们的特点、适用场景进行对比分析。 ### 1. SAX 解析器 #### 1.1 定义 SAX(Simple ...

    Java解析XML工具类--(java源码)

    * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...

    java解析XML的四种方式

    ### Java解析XML的四种方式详解 #### 一、DOM(Document Object Model) DOM是一种平台和语言中立的接口,它将XML文档表示为一个树结构,使得程序可以创建、读取、更新或删除树中的元素。DOM实现了W3C的标准,能够...

    java解析xml例子

    本篇文章将深入探讨如何在Java中解析XML,以帮助你理解和实践相关知识。 一、DOM解析器 DOM(Document Object Model)解析器是Java中的一种常用方法,它将整个XML文档加载到内存中,形成一个树形结构。以下是一个...

    Java解析XML的jar包+四种解析方法

    java解析xml的四种方法的比较,还有四种方法所用到的jar包 附带程序例子 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    java解析xml动态生成树形菜单结构

    总结起来,实现“java解析xml动态生成树形菜单结构”的项目,需要掌握以下核心知识点: 1. Java的DOM解析XML,构建树形数据结构。 2. 设计和实现无限层级的树形菜单数据模型。 3. 使用`JSTree`库在前端渲染树形菜单...

    java 解析XML性能对比分析Demo

    本文将深入探讨几种不同的XML解析方法,并通过实际的“Java解析XML性能对比分析Demo”来展示它们的性能差异。我们将讨论DOM、SAX、JDOM、DOM4J和JAXB这五种解析器,以及它们各自的特点和适用场景。 1. DOM(文档...

Global site tag (gtag.js) - Google Analytics