`
zht1933
  • 浏览: 218344 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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]

相关推荐

    详解Java解析XML的四种方法

    对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible ...

    JAVA解析XML的四种方法比较

    对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible ...

    生成XML文件ABAP程序

    REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE...

    JAVA解析XML的_比较方法

    对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible ...

    1.ASP.NET.2.0.XML.高级编程(第3版) [1/3]

    \r\n 1.1 XML入门 \r\n 1.1.1 自描述数据 \r\n 1.1.2 基本术语 \r\n 1.1.3 XML文档的组成部分 \r\n 1.2 XML技术 \r\n 1.2.1 DTD \r\n 1.2.2 XDR \r\n 1.2.3 XSD \r\n 1.2.4 XSLT \r\n 1.2.5 XML DOM \r\n...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    C# XML入门经典——C#编程人员必备的XML技能 作者:[美]Stewart Fraser, Steven 著,毛尧飞,崔伟 译 出版社:清华大学出版社 出版时间:2003年11月 第1章 在C#中使用XML的原因 &lt;br&gt;1.1 使用XML的原因...

    xml入门教程/xml入门教程

    XSLT,是用于对XML进行文档格式转换,把一个XML文档转换成另一种格式的XML文档,但是其中内容是不变的。 &2.DTD(Document Type Difinition DTD文档是用于规定XML文档的结构。只有结构符合所引用的DTD文件的XML文件...

    xml:不用担心的XML

    安装composer require veewee/xml组件 :通过DOM API在XML文档上进行操作。 :提供安全处理XML所需的工具。 :内存安全的XML阅读器。 :用于处理XSD架构的工具。 :将XML文档转换为其他内容。路线图这些组件尚未实现...

    sax:用于XML和HTML的sax-js sax样式解析器的维护分支

    XSLT-没有DOM =没有查询。 100%兼容(某些其他SAX实施)-大多数SAX实施均使用Java进行,其功能远不止于此。 XML验证程序-在严格模式下,它会进行少量验证,但不会进行太多验证。 模式意识XSD事物-模式是恋物癖...

    Microsoft XML 6.0(x64-x86)

    Microsoft Core XML Services (MSXML) 6.0 发行版提供以下项目的标准实现:XML 1.0(DOM 和 SAX2 API) XML Schema (XSD) 1.0 XPath 1.0 XSLT 1.0此外,还基于 HTTP 提供客户端和服务器安全的 XML 组件。MSXML6 还是...

    NJU_SOA_2015

    2. 采用DOM生成符合StudentList.xsd要求的XML文档2除写入Assignment1中的XML文档1的同学信息外, 还需要加入小组中其他同学的相关信息,并为每位同学随机生成五门课程的成绩(包含平时成绩、期末成绩和总评成绩),...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    13.1.2 XSD/XML模式定义 420 13.1.3 在Visual Studio .NET 2005中编辑XML和XML模式 422 13.2 XmlReader和XmlWriter 425 13.2.1 使用模式和XmlTextReader 427 13.2.2 包含NameTable优化 429 13.2.3 从XML中提取...

Global site tag (gtag.js) - Google Analytics