`
tzq668766
  • 浏览: 81917 次
  • 性别: 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】 Java提供了多种方式来解析XML文档,包括DOM解析和SAX解析,这两种方式各有优缺点,适用于不同的场景。本章将详细介绍这两种解析方法,并通过实例讲解如何使用Java来获取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 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提供了两种主要的API来处理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性能对比分析Demo

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

    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`库在前端渲染树形菜单...

Global site tag (gtag.js) - Google Analytics