a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 340|回复: 6

[JAVA] 2011年计算机等考二级JAVA学习精华整理(75)

[复制链接]
发表于 2012-7-31 22:04:26 | 显示全部楼层 |阅读模式
 3.3 Java 语言的 XML 验证 API  检查文档是否遵循了模式中规定的规则。不同的解析器和工具支持不同的模式语言如 DTD、W3C XML Schema 语言、RELAX NG 和 Schematron。Java 5™ 增加了统一的验证应用程序编程接口(API),可以把文档和用这种或那种语言编写的模式作比较。了解这种 XML 验证 API。
7 B( s/ b5 t: h& i$ c4 g5 N  验证是一种强大的工具。它可以快速检查输入是否大体上符合预期的形式,立刻拒绝与处理目标相距甚远的文档。如果数据中存在问题,早发现要比晚发现好。: T. o% f, t, }- S  Y3 p
  对于可扩展标记语言(XML)来说,验证一般意味着用各种模式语言为文档内容编写详细的规范,这些语言包括万维网联盟(W3C)的 XML Schema Language (XSD)、RELAX NG、文档类型定义(DTD)和 Schematron 等。有时候验证在解析的同时进行,有时候在解析完成后立刻进行。但一般在对输入的其他处理之前完成。(这一段描述只是粗略来说,因为存在例外。)0 B5 M7 G. m4 m* a) f
  直到最近,程序请求验证的具体应用程序编程接口(API)还随着模式语言和解析器的不同而不同。DTD 和 XSD 是 Simple API for XML (SAX)、文档对象模型(DOM)和 Java™ API for XML Processing (JAXP) 常见的配置选项。RELAX NG 需要自定义的库和 API。Schematron 可以使用 Transformations API for XML(TrAX),还有其他模式也要求程序员学习更多的 API,尽管执行的操作基本相同。
/ X. Z( @# j! Y  T5 M  Java 5 引入了 javax.xml.validation 包,提供了独立于模式语言的验证服务接口。这个包也可用于 Java 1.3 及更高版本,不过要单独安装 JAXP 1.3。其他产品中,Xerces 2.8 包含了这个库的实现。: S" [6 `+ T5 n3 e! o& }
  验证
5 f) [+ v. R: \& L" M  javax.xml.validation API 使用三个类来验证文档:SchemaFactory、Schema 和 Validator。还大量使用了 TrAX 的 javax.xml.transform.Source 接口来表示 XML 文档。简言之,SchemaFactory 读取模式文档(通常是 XML 文件)并创建 Schema 对象。Schema 创建一个 Validator 对象。最后,Validator 对象验证表示为 Source 的 XML 文档。6 z' g  \. e) F
  清单 1 显示了一个简单的程序,用 DocBook XSD 模式验证在命令行中输入的 URL。! r8 O9 `0 H# E3 E4 Z  Q
  清单 1. 验证可扩展超文本标记语言(XHTML)文档% H* n) t6 K: r3 N% C1 z1 T
  import java.io.*;
3 [% d- |$ t3 C# V  |+ j: }  import javax.xml.transform.Source;* C8 Y+ d  a" D9 H
  import javax.xml.transform.stream.StreamSource;- l; ^; V5 i. \' R% V3 S* t
  import javax.xml.validation.*;
1 ?9 y  ~. T5 ?* q# M  import org.xml.sax.SAXException;0 u" P4 D, D# m. |- G. s  t
  public class DocbookXSDCheck {
: f5 }1 K- ]/ S  C  public static void main(String[] args) throws SAXException, IOException {
8 D8 M! m5 x0 s; n5 V) |3 J! W  // 1. Lookup a factory for the W3C XML Schema language; X+ ]) Q/ x5 t
  SchemaFactory factory =: e/ J- ^1 \8 g  `. a
  SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");# E3 X* ~7 t6 _$ O+ y1 J# J4 k
  // 2. Compile the schema.2 W4 U" j# q* p
  // Here the schema is loaded from a java.io.File, but you could use: U. d4 \0 G) @+ B* y+ ^& ]% G7 ]
  // a java.net.URL or a javax.xml.transform.Source instead.) \$ q! `  j$ z* G/ B" |
  File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
6 x% [# _3 [1 P& ]1 t  Schema schema = factory.newSchema(schemaLocation);  C4 K/ b% R4 h; D. `+ L" D6 U1 t6 k
  // 3. Get a validator from the schema.# l: H/ b1 S9 p" m/ h/ m/ ?
  Validator validator = schema.newValidator();
+ G+ K3 f" a7 m& H9 l; y  // 4. Parse the document you want to check.
2 A6 {( _' i% V2 v, e+ n  Source source = new StreamSource(args[0]);
6 j4 _" q1 v: P/ `  // 5. Check the document
$ i8 w& m/ M: v0 M  try {6 B6 y9 H+ E( @+ {
  validator.validate(source);
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:27 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(75)

  System.out.println(args[0] + " is valid.");- ?, s1 T7 C" i( V
  }
8 u1 F& `5 K+ `3 M8 C! Z- o: p4 g  catch (SAXException ex) {: _7 `; t8 i  m- V! E
  System.out.println(args[0] + " is not valid because ");' H4 q, U" ~) L. \# Y, O0 p. _, T0 e
  System.out.println(ex.getMessage());+ h7 ?7 U7 ?9 ?. n4 ?; a
  }
+ W  r4 N: [* j8 x, @  }
& N' I" I4 @; {/ ]; i+ ^& N" y. N  }
" j+ C2 }7 t+ J: y( t5 ^4 o1 \) j6 T  下面是用捆绑到 Java 2 Software Development Kit (JDK) 5.0 的 Xerces 版本检查一个无效文档时的典型输出。
  p6 Z' x( i6 R$ ?  m  file:///Users/elharo/CS905/Course_Notes.xml is not valid because cvc-complex-type.2.3: Element 'legalnotice' cannot have character [children], because the type's content type is element-only.
- K$ I$ ?0 N' D. y3 P9 a. W8 p( Y  改变验证所依据的模式、要验证的文档甚至使用的模式语言都很简单。但无论什么情况,验证都需要经过下列五个步骤:
' }# Y( X, g1 I" ~8 J5 G7 V  为编写模式所用的语言加载一个模式工厂。% c3 P$ C) f1 r# \1 R
  编译源文件中的模式。
8 h8 r8 O7 p' ]3 H( Y4 z; T  用编译后的模式创建一个验证程序。
9 }5 I+ r3 w+ S% Z3 @2 Q0 S" a  为需要验证的文档创建 Source 对象。StreamSource 通常最简单。2 Z) d# a) [' Y8 Z" F* \
  验证输入的源文档。如果文档无效,validate() 方法将抛出 SAXException。否则什么也不显示。" @* _1 I/ E$ }+ Q/ Z0 c
  可以反复使用同一个验证程序和同一个模式多次。但是所有类都不是线程安全的或者可重入的。如果用多个线程同时验证,一定要保证每个线程有自己的 Validator 和 Schema 对象。$ i3 M$ G0 m" q5 i8 N. L
  用文档指定的模式验证
& O5 y2 n! Z5 |. f! c  有些文档指定了希望作为验证基础的模式,一般使用 xsi:noNamespaceSchemaLocation 和/或 xsi:schemaLocation 属性来指定,比如:- u: S, |! V) l$ |& ?) z/ g2 S

7 c. r' [1 w) ^2 ^  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:28 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(75)

  catch (SAXException ex) {
! X  p. w! o  ^! C8 I  System.out.println(input + " is not valid because ");
& J* _2 S8 b6 v6 b: F$ w  System.out.println(ex.getMessage());. a( c, _3 f! w; ~- p! n
  }, ^% k$ L- }  U! l' k9 g% ~+ Q
  }3 b9 v2 Q1 _8 p- f& |+ X
  }
/ W, t9 j* v) Y/ e1 @, v& ]  如果用普通的 Sun JDK 不增加其他库,运行该程序时可能会看到如下所示的结果:
5 {$ X8 S0 P+ }$ j3 c7 P  Exception in thread "main" java.lang.IllegalArgumentException:- J& {# L$ h/ E6 ^# f) q: o
  http://relaxng.org/ns/structure/1.0
% {- X% {5 {- ?* W7 s2 I$ H5 l  at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:186)" x" l, W) |( v
  at DocbookRELAXNGCheck.main(DocbookRELAXNGCheck.java:14)! m% r' J! H* _" z2 t% ^
  这是因为,JDK 本身没有带 RELAX NG 验证程序。如果不能识别模式语言,SchemaFactory.newInstance() 就会抛出 IllegalArgumentException。但是如果安装了 RELAX NG 库,比如 Jing 和 JAXP 1.3 适配程序,就会与 W3C 模式显示同样的结果。
5 p( G" Y/ e8 ~/ M5 z  确定模式语言
  S; c' I8 x+ {" O6 J  javax.xml.constants 类定义了几个常量来标识模式语言:
1 k" N0 B# n; X2 l  XMLConstants.W3C_XML_SCHEMA_NS_URI:http://www.w3.org/2001/XMLSchema
4 V8 o9 j' w+ r, j( w, D* z' [  XMLConstants.RELAXNG_NS_URI:http://relaxng.org/ns/structure/1.04 N# g8 b& n8 d
  XMLConstants.XML_DTD_NS_URI:http://www.w3.org/TR/REC-xml
: ]" w9 l/ B7 V  这是一个不完全的列表。实现可以随时向该表增加其他 URL 来标识其他的模式语言。URL 通常是模式语言的名称空间统一资源标识符(URI)。比如,URL http://www.ascc.net/xml/schematron 标识了 Schematron 模式。
0 I5 ^) t( x6 U, {  Sun 的 JDK 5 仅支持 XSD 模式。虽然也支持 DTD 验证,但是它不能通过 javax.xml.validation API 使用。对于 DTD,必须使用常规的 SAX XMLReader 类。不过可以另外安装支持不同模式语言的其他库。. ]" f: j; E& f- l+ b& t/ I  Y8 c
  如何定位模式工厂6 e2 q4 |. f" Z
  Java 编程语言没有限制模式工厂只能有一种。可以把标识某种模式语言的 URI 传递给 SchemaFactory.newInstance(),它按照下列顺序搜索匹配的工厂:
6 J1 M+ [3 I; I; f2 ~9 i" Q  用 "javax.xml.validation.SchemaFactory:schemaURL" 系统属性命名的类
. u0 [  w1 ^5 V" l  用 $java.home/lib/jaxp.properties 文件中的 "javax.xml.validation.SchemaFactory:schemaURL" 属性命名的类
. e: C( C, r& [8 Z' w: H  在任何 Java Archive (JAR) 文件的 META-INF/services 目录中发现的 javax.xml.validation.SchemaFactory 服务提供程序8 ]5 l  _3 ]3 ^: ]+ U
  平台默认的 SchemaFactory,JDK 5 中为 com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl
8 p" }  B) N/ l! |  要支持自定义的模式语言和对应的验证程序,只需要编写 SchemaFactory、Schema 和 Validator(它们知道如何处理模式语言)的子类。然后将您的 JAR 文件安装到上述四个位置中的一个。对于添加与 W3C XML Schema 语言这类声明性语言相比更适合用 Java 之类的图灵完整语言检查的约束,这一点很重要。可以定义一种微模式语言,编写简单的实现,然后将其插入到验证层。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:29 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(75)

  错误处理+ T9 ]9 `$ H+ c+ R. n! @) d/ m
  模式的默认响应方式是,如果遇到问题则抛出 SAXException,否则什么也不做。但是,可以提供 SAX ErrorHandler 来接收关于文档问题的更详尽的信息。比方说,假设要记录所有验证错误,但又不希望遇到错误时停止处理。可以安装一个像 清单 3 那样的错误处理程序。
6 d" q9 o: Y# M) Y& l' B  清单 3. 使用 RELAX NG 验证 DocBook 文档
. @/ x1 V( n5 o: F- Y  import org.xml.sax.ErrorHandler;
! l; S' S+ f8 W  import org.xml.sax.SAXException;
4 M8 {5 f( ~2 p1 h2 {& @  import org.xml.sax.SAXParseException;
% @& m( G$ u' z' W/ T  public class ForgivingErrorHandler implements ErrorHandler {* q, n. ^* N1 y
  public void warning(SAXParseException ex) {5 {4 U) f! N( E
  System.err.println(ex.getMessage());
: ^5 A% K0 H% H" V2 D6 b  }+ U0 |( P+ v. _" R2 y, ~5 A
  public void error(SAXParseException ex) {7 F+ W8 u; M4 _/ y% Q8 R1 [
  System.err.println(ex.getMessage());
8 e* a, P  W( @+ v9 m  }
7 ]+ ^# F* }/ a3 F  B$ }2 X  public void fatalError(SAXParseException ex) throws SAXException {4 [/ U2 b* F/ ?" S4 p
  throw ex;; U6 Y1 C# M" B
  }
; y. f/ v1 h+ Z5 z. o! e! n  }7 K" z2 y+ i6 |( m
  要安装该错误处理程序,需要创建它的一个实例并传递给 Validator 的 setErrorHandler() 方法:# k$ ?& Z" u* g8 u
  ErrorHandler lenient = new ForgivingErrorHandler();; w/ n- N3 J+ J/ h
  validator.setErrorHandler(lenient);8 o6 s' F" y$ {2 j8 M. V& w
  模式扩充3 c* j/ ^* g6 H6 a/ Q
  有些模式不仅仅执行验证。除了用是否回答文档有效与否的问题外,还为文档补充 其他信息。比方说,可以提供默认的属性值。还可以给元素或属性赋予 int 或 gYear 这样的类型。验证程序可以创建这种补充了类型信息的文档,并写入 javax.xml.transform.Result 对象。只需要传递 Result 作为验证的第二个参数。比如,清单 4 在验证输入文档的同时,还创建结合有模式输入的扩展后的 DOM 文档。
$ q0 _; {; f* O1 k  清单 4. 用模式扩充文档, `! o+ U/ D1 H. q' l
  import java.io.*;
- x' n( I5 s  E! U  h  j  import javax.xml.transform.dom.*;
' j# g6 }1 d# R8 m% ~+ ?' v8 L  import javax.xml.validation.*;
5 ^8 ~8 |: a" t4 ?$ w  import javax.xml.parsers.*;
$ a/ d# l4 B0 r2 m! j) P; ^1 U  import org.w3c.dom.*;1 q! T, H3 v4 d, C( ?' c3 w& t% e
  import org.xml.sax.SAXException;% K: a+ `0 Q2 q8 C( d6 y
  public class DocbookXSDAugmenter {7 b: K& [& n% r' ?
  public static void main(String[] args)0 t0 w+ w, `! b+ d9 J
  throws SAXException, IOException, ParserConfigurationException {
+ F* _1 @5 T$ X6 i5 b  SchemaFactory factory! e, n6 k9 K3 ^2 G9 \' z
  = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
/ k, H" @3 j' H! \1 {+ t3 B  File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
% ~" k; ~% j4 p+ Q" F8 X$ ]5 e: n  Schema schema = factory.newSchema(schemaLocation);. z% M- O  _/ }8 h8 e+ N! I% Z
  Validator validator = schema.newValidator();
/ S6 b9 H, J$ ~3 K  DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();' n- c7 [( u8 f4 l: n, N* [
  domFactory.setNamespaceAware(true); // never forget this4 K9 ]- ^3 [! Z5 [
  DocumentBuilder builder = domFactory.newDocumentBuilder();
$ j! ~0 ]6 E7 C% I  Document doc = builder.parse(new File(args[0]));
. y# X3 A& E% U. {2 X  DOMSource source = new DOMSource(doc);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:30 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(75)

DOMResult result = new DOMResult();  try {2 m( h- B! Y) _2 ^$ K2 b
  validator.validate(source, result);+ E. X. q1 z! ^: T* H  Q2 M
  Document augmented = (Document) result.getNode();
' \6 t0 g  _; n# P  // do whatever you need to do with the augmented document...! b; c! v- {. V, E$ D& o# n, ]. E
  }' o/ X: S1 N: A" j, \6 V" U- e& ?
  catch (SAXException ex) {. z5 ^( |. S9 J7 J+ {! \- z& e" e1 X
  System.out.println(args[0] + " is not valid because ");) s4 G* n6 s  Q7 y& }
  System.out.println(ex.getMessage());
# N( u  q2 X4 o9 |, l; `; t3 m  }0 ]$ p# k2 a, g$ O9 G* [7 ]
  }
( f+ c% T6 e1 D  }
8 c6 d9 E9 I1 |  这个过程的输入和输出都有一定的限制。不能用于所有的流输入和输出。SAX 源可以扩展成 SAX 结果,DOM 源扩展成 DOM 结果,但是 SAX 源不能扩展成 DOM 结果,反之亦然。如果需要这么做,首先扩展成匹配的结果:SAX 对 SAX、 DOM 对 DOM,然后使用 TrAX 的恒等转换改变模型。
7 X, ]4 n0 V( V% Z6 B  但不建议使用这种技术。将文档需要的全部信息放在一个实例中,要比分解成实例和模式更可靠。您可以验证,但并非所有的人都能验证。# @7 o$ q3 Y( Z( W% m/ K' \" n) Y
  类型信息; _8 I9 |( ]4 h4 V
  W3C XML Schema Language 在很大程度上依赖于类型 这一概念。元素和属性被声明为 int、double、date、duration、person、PhoneNumber 或其他您能够想到的类型。Java Validation API 提供了一种手段来报告这些类型,虽然令人吃惊的是该特性独立于包的其他部分。
+ s  F% H# F4 x1 c& T7 w  类型用 org.w3c.dom.TypeInfo 对象表示。这个简单的接口通过 清单 5 来说明,它给出了类型的本地名和名称空间 URI。还可以告诉您它是否派生自其他类型。除此以外,理解这种类型就是您的程序的任务了。Java 语言没有说明它的含义,或者将其转化成 double 和 java.util.Date 这样的 Java 类型。* L0 k* {3 E: M( c8 p  D
  清单 5. DOM TypeInfo 接口1 Z0 k: e9 ^0 X( t
  package org.w3c.dom;
$ ~/ {  _; `. u' O% U% O  public interface TypeInfo {5 }) ~. T3 W9 H& M' A' P
  public static final int DERIVATION_RESTRICTION;
6 x; ]* H/ ^, |  public static final int DERIVATION_EXTENSION;4 }% S" G0 G& ?7 C( v
  public static final int DERIVATION_UNION;
' `0 v8 o% C+ C; j6 q$ z% V5 F0 X  public String getTypeName();
/ s1 p! }, i/ l4 {* W  public String getTypeNamespace()/ C0 u. x2 K+ b6 h8 G0 `
  public boolean isDerivedFrom(String namespace, String name, int derivationMethod);
8 A: m2 [9 R- w5 b  }
4 T: |+ W+ g% H( m1 c  要获得 TypeInfo 对象,需要向 Schema 对象请求 ValidatorHandler 而不是 Validator。ValidatorHandler 实现了 SAX 的 ContentHandler 接口。然后将该处理程序安装到 SAX 解析器中。1 O  g, L5 M3 K
  还要在 ValidatorHandler(不是解析器)中安装您自己的 ContentHandler,ValidatorHandler 将把扩展的事件转发到您的 ContentHandler。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:31 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(75)

 ValidatorHandler 提供了 TypeInfoProvider,ContentHandler 可以随时调用查看当前元素或其属性的类型。它还可以告诉您该属性是否是 ID,属性是在文档中明确指定的还是模式中的默认值。清单 6 对这个类作了概括。  清单 6. TypeInfoProvider 类
7 I2 f  X" Q/ C: o7 a  S0 n  package javax.xml.validation;
& [8 T: o* x/ m6 {5 [8 f  public abstract class TypeInfoProvider {
; D; _) E8 A' k# r4 [  public abstract TypeInfo getElementTypeInfo();* H3 ~) |2 L8 ^+ F4 R
  public abstract TypeInfo getAttributeTypeInfo(int index);
5 I* P2 f! b0 F5 S* _) h. D: J  public abstract boolean isIdAttribute(int index);1 o7 ?% x: x. b4 a8 t' ^
  public abstract boolean isSpecified(int index);
1 {( v' P. |# U2 \1 l3 d  }3 @) \( ]/ M) l8 y: X
  最后,用 SAX XMLReader 解析文档。清单 7 是一个简单的程序,它利用了所有这些类和接口打印出文档所有元素的类型名。9 b7 [- ~- }' O2 m* b  c
  清单 7. 列举元素类型
" p2 @+ l* C$ v" d  import java.io.*;% c+ E5 |, X( e* {$ o
  import javax.xml.validation.*;
( G0 S* h4 [2 ]7 W0 V  import org.xml.sax.*;
: F2 m  f+ @9 p7 B! e  s! w: D  import org.xml.sax.helpers.*;
# D; Z2 n; Y' W; b& Q- o7 s  public class TypeLister extends DefaultHandler {, [6 M/ Z! ^( Z7 o9 }
  private TypeInfoProvider provider;
- U6 j1 N# n& z7 `$ _  public TypeLister(TypeInfoProvider provider) {8 F' Q, r. T0 r# J0 l4 q- ^
  this.provider = provider;7 {) j0 \: |( E
  }/ \) f8 N& _$ W1 u+ R
  public static void main(String[] args) throws SAXException, IOException {
1 ~4 y3 x4 U2 T) J- K5 V: v* g  SchemaFactory factory; m& W4 \  ]+ E
  = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
7 w( P9 k( B) T  File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");3 `  o. A4 N) H$ J; p
  Schema schema = factory.newSchema(schemaLocation);
+ s8 c; l3 R& y  ValidatorHandler vHandler = schema.newValidatorHandler();
$ O# o. i: [# y6 k  TypeInfoProvider provider = vHandler.getTypeInfoProvider();) I( R+ @' r: u. B
  ContentHandler cHandler = new TypeLister(provider);
4 d( V+ [3 P1 \9 S# @  vHandler.setContentHandler(cHandler);
9 N. i1 k. I4 z  t7 Q. D( @  XMLReader parser = XMLReaderFactory.createXMLReader();8 U! u! @6 P6 F2 C9 Q9 a
  parser.setContentHandler(vHandler);, }# Z: `5 O9 ~  l3 L; U
  parser.parse(args[0]);4 T( Z. U, o& D$ h; C- \
  }
& [' h' B3 _5 A1 b  public void startElement(String namespace, String localName,9 g7 z* R) Q8 u; H. _- l
  String qualifiedName, Attributes atts) throws SAXException {
6 x$ v2 O  a9 q  String type = provider.getElementTypeInfo().getTypeName();1 C" c+ |' t; g  z
  System.out.println(qualifiedName + ": " + type);- P4 b) A9 g! N+ }( _) {
  }( j9 x$ l/ r" ]5 Q, R+ @
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:32 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(75)

 下面列出了对典型的 DocBook 文档运行上述代码的结果的开始部分:  book: #AnonType_book
1 h7 \* y: R+ }" B- X' e+ v/ Q' F  title: #AnonType_title/ g* m. ^# s* P
  subtitle: #AnonType_subtitle. I0 D9 S% ^4 k  z7 A9 g
  info: #AnonType_info( R: y2 Q2 |/ g
  copyright: #AnonType_copyright8 w2 j! O) e  w$ J! ]
  year: #AnonType_year% `  ?' D6 @7 E/ `  i# b0 V# o' v) B
  holder: #AnonType_holder
: e9 C2 X4 `8 M  A+ ~$ B  author: #AnonType_author
0 {% j5 p0 O; L& z' f9 t3 I# _  personname: #AnonType_personname8 M$ B6 d$ t4 _& s# y; z+ [
  firstname: #AnonType_firstname
3 q# d" h2 M8 h8 w$ @  othername: #AnonType_othername: i: M0 L* s: E9 V
  surname: #AnonType_surname& e: t  v9 j: g: O5 U1 W
  personblurb: #AnonType_personblurb
( S/ \+ P4 u+ d1 \$ K; V  para: #AnonType_para. Y$ c4 g9 n2 v9 v& f. y
  link: #AnonType_link
0 l3 i7 J% Z  b9 Z, S/ K8 S  可以看到,DocBook 模式赋予大多数元素以匿名的复杂类型。显然,结果会随着模式的不同而变化。
8 L# r% B6 [, O1 ?  结束语- m2 z. `6 U# t9 G8 ^9 P
  如果所有人都说同一种语言,世界会变得更加单调。如果只有一种编程语言可以选择,程序员也会感到不高兴。不同的语言更适合不同的任务,有些任务需要不只一种语言。XML 模式也不例外。您可以从各种各样的模式语言中选择。拥有了 Java 5 及其 javax.xml.validation,就能用一种 API 处理所有这些模式语言。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-3 09:45 , Processed in 0.427807 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表