Package javax.xml.transform
Source
和Result
接口来实现这一点。
为了为用户提供具体的类,该API定义了根级别接口的特定实现。这些接口位于javax.xml.transform.sax
、javax.xml.transform.dom
、javax.xml.transform.stax
和javax.xml.transform.stream
中。
创建对象
API允许从静态函数TransformerFactory.newInstance()
创建具体的TransformerFactory
对象。
输入和输出的规范
该API定义了两个名为Source
和Result
的接口对象。为了将Source和Result对象传递给接口,必须使用具体类。为每个对象定义了以下具体表示:StreamSource
和StreamResult
,StAXSource
和StAXResult
,SAXSource
和SAXResult
,以及DOMSource
和DOMResult
。每个对象定义了一个FEATURE字符串(以URL形式),可以将其传递给TransformerFactory.getFeature(java.lang.String)
以查看是否支持给定类型的Source或Result对象。例如,要测试是否支持DOMSource和StreamResult,可以应用以下测试。
TransformerFactory tfactory = TransformerFactory.newInstance();
if (tfactory.getFeature(DOMSource.FEATURE) &&
tfactory.getFeature(StreamResult.FEATURE)) {
...
}
限定名称表示
在处理XML对象时,命名空间会带来一些问题。限定名称在XML标记中显示为带前缀的名称。但是前缀本身并不具有唯一性。相反,它们上下文映射到的URI具有唯一性。因此,当在Java程序之间传递类似"xyz:foo"的限定名称时,必须提供一种将"xyz"映射到命名空间的方法。
一种解决方案是创建一个包含命名空间URI、前缀和本地名称的"QName"对象,但这并不总是最佳解决方案,例如当您想要在字典对象中使用唯一字符串作为键时。没有字符串表示形式也使得在XML文档之外指定命名空间标识变得困难。
为了将带命名空间的值传递给转换,例如在为Transformer
对象设置属性或参数时,该规范定义了一个名为"qname"的字符串对象参数,该参数作为两部分字符串传递,命名空间URI用大括号({})括起来,后跟本地名称。如果qname具有空URI,则字符串对象仅包含本地名称。应用程序可以通过检查名称的第一个字符是否为'{'字符来安全地检查非空URI。
例如,如果从定义为<xyz:foo xmlns:xyz="http://xyz.foo.com/yada/baz.html"/>的元素中获取了URI和本地名称,则限定名称将是"{http://xyz.foo.com/yada/baz.html}foo"。请注意,前缀会丢失。
结果树序列化
可以使用Transformer.setOutputProperties(java.util.Properties)
和Transformer.setOutputProperty(java.lang.String, java.lang.String)
方法控制将结果树序列化到流中。这些属性仅适用于流结果,在结果为DOM树或SAX事件流时不起作用。
符合XSLT规范中xsl:output属性的字符串可以从OutputKeys
类中引用。也可以指定其他字符串。如果转换器不识别输出键,将抛出一个IllegalArgumentException
,除非键名是命名空间限定的。始终允许命名空间限定的输出键名称,尽管某些实现可能会忽略它们。
如果只需进行源到结果的简单标识转换,则TransformerFactory
提供了一个不带参数的TransformerFactory.newTransformer()
方法。此方法创建一个Transformer,有效地将源复制到结果。此方法可用于从SAX事件创建DOM或从DOM或SAX事件创建XML或HTML流。
异常和错误报告
转换API抛出三种特殊异常。当存在与TransformerFactory的配置问题时,会抛出一个TransformerFactoryConfigurationError
,类似于FactoryConfigurationError
,当无法找到或实例化使用"javax.xml.transform.TransformerFactory"系统属性指定的转换工厂类时,通常会抛出此错误。
如果由于任何原因无法创建Transformer,则可能会抛出TransformerConfigurationException
。如果转换指令中存在语法错误,例如调用TransformerFactory.newTransformer(javax.xml.transform.Source)
时,可能会抛出TransformerConfigurationException。
TransformerException
是在转换过程中发生的一般异常。转换器异常可能包装另一个异常,如果在其上调用任何TransformerException.printStackTrace()
方法,则会生成一系列堆栈转储,从最近的开始。转换器异常还提供一个SourceLocator
对象,指示错误发生在源树或转换指令的哪个位置。TransformerException.getMessageAndLocation()
可用于获取带有位置信息的错误消息,TransformerException.getLocationAsString()
可用于仅获取位置字符串。
转换警告和错误将发送到ErrorListener
,此时应用程序可以决定报告错误或警告,并可能决定对非致命错误抛出异常。可以通过TransformerFactory.setErrorListener(javax.xml.transform.ErrorListener)
设置ErrorListener
以报告与转换指令中的语法错误有关的错误,或通过Transformer.setErrorListener(javax.xml.transform.ErrorListener)
报告转换过程中发生的错误。这两个对象上的ErrorListener
始终有效且非null
,无论是由应用程序设置还是处理器提供的默认实现。
转换中URI的解析
API提供了一种方式,使得在样式表指令中引用的URI或转换中引用的URI可以由调用应用程序解析。这可以通过创建一个实现了URIResolver
接口的类来实现,该接口具有一个方法URIResolver.resolve(java.lang.String, java.lang.String)
,并使用此类为转换指令或转换设置URI解析,方法是通过TransformerFactory.setURIResolver(javax.xml.transform.URIResolver)
或Transformer.setURIResolver(javax.xml.transform.URIResolver)
。URIResolver.resolve
方法接受两个String参数,第一个参数是在样式表指令中找到的URI或作为转换过程的一部分构建的URI,第二个参数是基本URI,如果需要绝对URI,则将第一个参数相对于基本URI。返回的Source
对象必须可由转换器使用,如其实现的特性所指定。
- 自版本:
- 1.5
-
ClassDescription由
TransformerFactory
或Transformer
使用的监听器接口,用于在转换过程中发生错误消息时通知调用者。提供了可用于设置Transformer的输出属性或从Transformer或Templates对象中检索输出属性的字符串常量。实现此接口的对象包含构建转换结果树所需的信息。实现此接口的对象包含作为源输入(XML源或转换指令)所需的信息。此接口主要用于报告XML源或转换指令中发生错误的位置。实现此接口的对象是已处理的转换指令的运行时表示。此抽象类的实例可以将源树转换为结果树。指示严重的配置错误。此类指定了在转换过程中发生的异常情况。可以使用TransformerFactory实例创建Transformer
和Templates
对象。当存在与Transformer工厂配置相关的问题时抛出。实现此接口的对象可以被处理器调用,将在document()、xsl:import或xsl:include中使用的URI转换为Source对象。