`

XSD、XSLT、DOM4J解析XML

    博客分类:
  • JAVA
阅读更多

xml文件 000.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="000.xsl"?>
<addresses>
 <value>
  <no>A100</no>
  <addr>上单位dd</addr>
 </value>
 <value>
  <no>A101</no>
  <addr>ss撒发达</addr>
 </value>
</addresses>

xsd文件 000.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

 <xs:element name="addresses">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="value" maxOccurs="unbounded">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="no" type="xs:string" />
       <xs:element name="addr" type="addr" />
      </xs:sequence>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>


 <xs:simpleType name="addr">
  <xs:restriction base="xs:string">
   <xs:minLength value="1" />
   <xs:maxLength value="5" />
  </xs:restriction>
 </xs:simpleType>

</xs:schema>
xslt文件 000.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <!-- XSLT 语法参考w3cschool -->
 <xsl:template match="/">
  <html>
   <head>
    <title>First XSLT example</title>
   </head>
   <body>
    <p>
     <table border='1'>
      <xsl:for-each select="addresses/value">
       <tr>
        <td>
         <xsl:value-of select="no" />
        </td>
        <td>
         <xsl:value-of select="addr" />
        </td>
       </tr>
      </xsl:for-each>
     </table>
    </p>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>

bean文件 XmlBean.java

package com.zht.bean;
public class XmlBean {
    private String no;  
    private String addr;  
    public String getNo() {  
        return no;  
    }  
    public void setNo(String no) {  
        this.no = no;  
    }  
    public String getAddr() {  
        return addr;  
    }  
    public void setAddr(String addr) {  
        this.addr = addr;  
    }  
    @Override 
    public String toString() {  
        return "编号:" + this.no + ",地址:" + this.addr;  
    }  
}
路径文件 ReadXmlFileStream.java

package com.zht.xml;
import java.io.InputStream;
public class ReadXmlFileStream {
  private static final String XML_FILE = "com/zht/bean/000.xml"; 
  private static final String XSD_FILE = "com/zht/bean/000.xsd"; 
  private static final String XSL_FILE = "com/zht/bean/000.xsl";   
  private static final String HTML_FILE = "com/zht/bean/001.HTML";
     public static InputStream getXmlFileStream() {   
         return Thread.currentThread().getContextClassLoader()   
                 .getResourceAsStream(XML_FILE);   
     }
  public static String getXML_FILE() {
   return XML_FILE;
  }
  public static String getXSD_FILE() {
   return XSD_FILE;
  }
  public static String getXSL_FILE() {
   return XSL_FILE;
  }
  public static String getHTML_FILE() {
   return HTML_FILE;
  }   
}
解析xml文件 DOM4JParseXml.java

package com.zht.xml;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Iterator;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.SAXValidator;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;

import com.zht.bean.XmlBean;

public class DOM4JParseXml {
  private static XmlBean address = new XmlBean();   
    
     public static void main(String[] args) {   

//     读取XML文件内容 
//      ---====================读xml文件========================================
         long starttime = System.currentTimeMillis();   
   
         try {   
             InputStream in = ReadXmlFileStream.getXmlFileStream();   
   
             Reader reader = new InputStreamReader(in, "utf-8"); // 注意编码问题   
   
             SAXReader SaxReader = new SAXReader();   
             Document doc = SaxReader.read(reader);   
             Element root = doc.getRootElement();   
             Element childNode = null;   
//           枚举名称为value的节点   
             for (Iterator<Element> it = root.elementIterator("value"); it.hasNext();) {   
                 childNode = (Element) it.next();   
                 address.setNo(childNode.elementText("no"));   
                 address.setAddr(childNode.elementText("addr"));   
                 System.out.println(address);   
             }   
         } catch (Exception e) {   
             e.printStackTrace();   
         }   
         System.out.println("运行时间:" + (System.currentTimeMillis() - starttime) + " 毫秒");   
//    ---============================================================
        
//     写XML文件内容 
         try {
    testWrite();
   } catch (Exception e) {
    e.printStackTrace();
   }
        
//      XML经XSD文件进行校验
         validateXMLByXSD();
            
//      XML经XSLT转换为HTML文件
      String xml = ReadXmlFileStream.getXML_FILE();
      String xsl = ReadXmlFileStream.getXSL_FILE();
      String out = ReadXmlFileStream.getHTML_FILE();
      xsl(xml,out,xsl);
   
     } 
    

     /**  
      * 写XML  
      */  

     public static void testWrite() throws Exception{
        
         Document document = DocumentHelper.createDocument();
        
         Element root = document.addElement("root");
        
         Element element1 = root.addElement("user")
         .addAttribute("name","Alexander")
         .addAttribute("blog", "http://netnova.blogjava.net")
         .addText("我是中文的名字");

        
         XMLWriter writer = new XMLWriter(new FileOutputStream("com/zht/bean/001.xml"));
        
         writer.write(document);
         writer.close();   
         System.out.println("写XML文件成功~!");
     }

 

     /**  
      * 通过XSD(XML Schema)校验XML  
      */ 
     public static void validateXMLByXSD() {  
         String xmlFileName = ReadXmlFileStream.getXML_FILE();  
         String xsdFileName = ReadXmlFileStream.getXSD_FILE();  
         try {  
             //创建默认的XML错误处理器   
             XMLErrorHandler errorHandler = new XMLErrorHandler();  
             //获取基于 SAX 的解析器的实例   
             SAXParserFactory factory = SAXParserFactory.newInstance();  
             //解析器在解析时验证 XML 内容。   
             factory.setValidating(true);  
             //指定由此代码生成的解析器将提供对 XML 名称空间的支持。   
//             factory.setNamespaceAware(true);  
             //使用当前配置的工厂参数创建 SAXParser 的一个新实例。   
             SAXParser parser = factory.newSAXParser();  
             //创建一个读取工具   
             SAXReader xmlReader = new SAXReader();  
             //获取要校验xml文档实例   
             Document xmlDocument = (Document) xmlReader.read(new File(xmlFileName));  
             //设置 XMLReader 的基础实现中的特定属性。核心功能和属性列表可以在 [url]http://sax.sourceforge.net/?selected=get-set[/url] 中找到。   
             parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");  
             parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:" + xsdFileName);  
             //创建一个SAXValidator校验工具,并设置校验工具的属性   
             SAXValidator validator = new SAXValidator(parser.getXMLReader());  
             //设置校验工具的错误处理器,当发生错误时,可以从处理器对象中得到错误信息。   
             validator.setErrorHandler(errorHandler);  
             //校验   
             validator.validate(xmlDocument);  
  
             XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());  
             //如果错误信息不为空,说明校验失败,打印错误信息   
             if (errorHandler.getErrors().hasContent()) {  
                 System.out.println("XML文件通过XSD文件校验失败!");  
                 writer.write(errorHandler.getErrors());  
                 System.out.println(errorHandler.getErrors().asXML());
                
             } else {  
                 System.out.println("Good! XML文件通过XSD文件校验成功!");  
             }  
         } catch (Exception ex) {  
             System.out.println("XML文件: " + xmlFileName + " 通过XSD文件:" + xsdFileName + "检验失败。\n原因: " + ex.getMessage());  
             ex.printStackTrace();  
         }  
     }  
  

     /**  
      * 通过XSL生成HTML文件

      */  
     public static void xsl(String inFilename, String outFilename,
   String xslFilename) {
  try {
   TransformerFactory factory = TransformerFactory.newInstance();

   Templates template = factory.newTemplates(new StreamSource(
     new FileInputStream(xslFilename)));

   Transformer xformer = template.newTransformer();

   Source source = new StreamSource(new FileInputStream(inFilename));
   Result result = new StreamResult(new FileOutputStream(outFilename));

   xformer.transform(source, result);
   System.out.println("生成html成功~!");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}

 

 

分享到:
评论
1 楼 songrubo 2012-08-22  
[b]
[color=brown][color=yellow] :D  :)  :(  :o  :shock:  :?  8)  :lol:  :x  :P  :oops:  :arrow:  :idea:  :?:  :!:  :evil:  :evil:  :[size=medium][/size][align=left][/align]evil:  :evil: [/color][/color][flash=200,200][/flash]
引用
[u][/u][i][/i][/b]

相关推荐

    dom4j-1.6.1.jar和xmlbeans-2.6.0.jar

    2. **SAX和DOM**: 除了DOM,DOM4J还支持SAX解析器,允许在内存有限的情况下处理大型XML文件。 3. **XPath**: 支持XPath表达式,使得可以方便地定位和提取XML文档中的特定节点。 4. **事件模型**: 提供了基于事件的...

    dom4j 例子,演示了3个功能

    读取XML文件,DOM4J使用SAXReader类,它可以解析XML文件并构建DOM4J的Document对象。之后,可以通过XPath表达式或者直接遍历元素树来访问XML数据。 ```java SAXReader reader = new SAXReader(); Document doc = ...

    xml基础(dtd约束模式,schema约束模式,xslt样式,sax解析,dom解析,jom解析)

    本文将深入探讨XML的基础知识,包括DTD(Document Type Definition)约束模式、Schema约束模式、XSLT样式表、SAX解析和DOM解析,以及不太常见的JOM解析。 1. **XML基础**: - XML设计的目标是传输和存储数据,而非...

    dom4j使用简介

    - **XML数据的解析与生成**:DOM4J提供了强大的API来解析和生成XML数据,适用于需要读取和创建XML文档的应用。 - **XML数据的转换**:通过XPath和XSLT支持,DOM4J可以方便地实现XML数据的转换和格式化。 - **XML数据...

    dom4j.jar 和 jaxen-1.1-beta-4.jar

    DOM4J和JAXEN是XML处理领域中的两个重要库,尤其在解析XSD(XML Schema Definition)文件时,它们起到了关键作用。DOM4J是一个功能强大且灵活的Java XML API,而JAXEN则是一个XPath处理器,允许你在各种XML API之间...

    xsd,xml,htm,xsl,dom例子

    在IT领域,XML(eXtensible Markup Language)、XSD(XML Schema Definition)、HTML(Hypertext Markup Language)、XSL(Extensible Stylesheet Language)和DOM(Document Object Model)是五种非常重要的技术,...

    解析XML--老师(解析,修改,删除,导出)

    2. **XML库支持**:如Java的JDOM、DOM4J,Python的lxml等库提供了丰富的API,简化XML文档的修改操作。 ### XML删除 1. **DOM操作**:删除DOM树中的节点,相应地更新XML文档。 2. **XPath表达式**:使用XPath定位要...

    XML解析代码实现.rar

    在开发过程中,XML解析还涉及到错误处理,例如验证XML是否符合其指定的DTD(Document Type Definition)或XSD(XML Schema Definition)。此外,XPath(XML Path Language)和XSLT(XML Stylesheet Language ...

    解析xml,生成java类

    1. JAXP (Java API for XML Processing):这是Java标准的XML处理API,包括DOM、SAX和XSLT支持。 2. JAXB (Java Architecture for XML Binding):JAXB是Java SE的一部分,用于自动将XML和Java对象之间进行映射,方便...

    java解析XML详解.pdf

    Java提供了丰富的API来处理XML文件,主要包括JAXP(Java API for XML Processing)、JDOM(Java-based XML API)和DOM4J等。JAXP是Java官方提供的XML处理包,它内嵌了对DOM、SAX和XSLT的支持,无需额外添加库文件。 ...

    解析XML--自己

    在Python中,我们可以使用`xml.dom.minidom`库进行DOM解析,`xml.sax`库进行SAX解析。例如,使用DOM解析XML文档: ```python import xml.dom.minidom doc = xml.dom.minidom.parse("example.xml") root = doc....

    用于xml解析jar包

    在本例中,"用于xml解析jar包"可能包含了一些用于XML解析的Java类库,如JAXB、DOM4J、JDom或Woodstox等。 4. JAXB(Java Architecture for XML Binding): JAXB是Java标准API,用于将XML文档和Java对象之间进行...

    xml编程实验报告_xml_学生成绩管理系统_xml管理系统_

    1. **XML解析**:你可以使用DOM(Document Object Model)或SAX(Simple API for XML)解析器来读取和操作XML文档。DOM将整个XML文件加载到内存中,便于查找和修改数据;而SAX则是事件驱动的,只在需要时读取部分...

    xml解析.zip

    XML解析是处理XML文档的关键步骤,主要有两种方式:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。 1. DOM解析:DOM将整个XML文档加载到内存中,形成一棵元素树。每个节点代表XML文档的一部分...

    解析XML文件

    4. **第三方解析库**:除了标准的Java API,还有许多第三方库如JDOM、DOM4J、XOM等,它们提供了更易用的API来操作XML。 5. **在线解析工具**:对于简单的XML文件分析,一些在线工具如XML Viewer、Pretty XML等可以...

    w3c xml4j 工具第二版 源码下载

    1. **XML解析**:XML4J提供了DOM(Document Object Model)和SAX(Simple API for XML)两种解析方式。DOM解析将整个XML文档加载到内存中,形成一个树形结构,便于进行复杂的查询和修改操作。而SAX是一种事件驱动的...

    xml_java指南

    1. 解析XML:Java提供了多种解析XML的方法,包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。DOM将整个XML文档加载到内存中,形成一棵树状结构,适合小规模或静态...

    c# XML解析

    使用`XmlSchemaSet`和`XmlReaderSettings`,可以在解析XML时验证其是否符合指定的XML Schema(XSD),确保数据的正确性。 10. **异步XML处理** 在.NET Framework 4.5及以上版本,`XmlReader`和`XmlWriter`支持...

    xml入门到java解析

    4. DTD(Document Type Definition)与XSD(XML Schema):这两个是XML的验证机制,用来定义XML文档的结构和数据类型。 二、Java解析XML 1. DOM解析:DOM(Document Object Model)模型将整个XML文档加载到内存中...

Global site tag (gtag.js) - Google Analytics