严格的层ơ结构?/B>DOM API 直接沿袭?XML 规范。在 XML 中,每g东西都是一个结点,因此(zhn)能?DOM 中找C个几乎每件东襉K可以扩展的基?Node 的接口和q回 Node 的一pdҎ(gu)。就多态性的观点来讲Q它是优U的,但鉴于如上解释,它在 Java 语言中的应用是困难而且不便的,其中?Node 向叶cd作显式下拉会(x)D代码的冗长和难以理解?BR>
接口驱动?/B>公共 DOM API 仅由接口l成Q?CODE>Exception cL一个例外,但恰恰够了Q。w3c Ҏ(gu)供实现ƈ不感兴趣Q它只对定义接口Q比较有意义Q感兴趣。但它也意味着作ؓ(f) Java E序员?API 在创?XML 对象时增加了分散E度Q因?w3c 标准大量使用工厂化的cdcM的灵zȝ但不直接的模式。在某些应用中,XML 文档是仅p法分析器建立的,而从不会(x)由应用程序代码建立Q这是不相关的。但是,随着 XML 更广泛的使用Qƈ不是所有问题都l箋需要由语法分析器来驱动。应用程序的开发h员需要一个更方便的方法有计划地构?XML 对象?/FONT>
对于E序员,q些U束意味着庞大Q在内存占用和接口大方面)的和难掌握的 APIQ学?fn)和使用都很难。相反,JDOM 是作ZU轻量 API 被制定的Q最主要的是它是?Java Z心的。它在遵?DOM 主要规则的基上除M上述~点Q?/FONT>
TransformerFactory tFactory = TransformerFactory.newInstance();
// Make the input sources for the XML and XSLT documents
org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
org.w3c.dom.Document domDocument = outputter.output(myDocument);
javax.xml.transform.Source xmlSource =
new javax.xml.transform.dom.DOMSource(domDocument);
StreamSource xsltSource =
new StreamSource(new FileInputStream("/some/directory/car.xsl"));
// Make the output result for the finished document using
// the HTTPResponse OutputStream
StreamResult xmlResult = new StreamResult(response.getOutputStream());
// Get a XSLT transformer
Transformer transformer = tFactory.newTransformer(xsltSource);
// Do the transform
transformer.transform(xmlSource, xmlResult);
]]>Q{Q从 DOM 转换http://www.aygfsteel.com/su/articles/1589.html温馨虫窝温馨虫窝Tue, 01 Mar 2005 06:45:00 GMThttp://www.aygfsteel.com/su/articles/1589.htmlhttp://www.aygfsteel.com/su/comments/1589.htmlhttp://www.aygfsteel.com/su/articles/1589.html#Feedback0http://www.aygfsteel.com/su/comments/commentRss/1589.htmlhttp://www.aygfsteel.com/su/services/trackbacks/1589.html 如果(zhn)对 W3C ?DOMQ文档对象模型)感兴而且认ؓ(f) SAX 很灵巧的话,那么(zhn)必LZU方法将 DOM 转换成应用程序开发h员用的其它格式。当Ӟq些其它格式是指 SAX ?JDOM。如果必d DOM 作ؓ(f)输入且要它转换成其它格式时Q要做什么?q当然是一个值得研究的问题。由?DOM 提供了完整的文档表示Q将它{换成另外一U格式当然是可行的。在本文中,(zhn)将了解如何执行?DOM ?SAX ?JDOM 的{换?BR> ?DOM ?SAX 遗憾的是QDOM U别 1 和更新的U别 2 没有提供?DOM ?wi)输出?SAX 或其它格式的方式。结果是每个语法分析器实现都提供了一l用于输出的定制 APIQ实现的独立性׃。换句话_(zhn)的代码只能与那个ؓ(f)它编写的语法分析器一起工作(?Crimson、Xerces ?Oracle {等Q。DOM U别 3 被认为是提供了这功能,所以我们都必须静观 DOM U别 3 能提供什么输出方法。同Ӟ查看一下供应商提供的有关编写或串行?DOM ?wi)的文档。例如?Apache XercesQ需要用如清单 1 中所C的 org.apache.xml.serialize.XMLSerializer cR?在每一U情形,(zhn)将有可能必M的形式输出 DOM ?wi),然后这个流交?SAX q行后箋处理。请注意Q清?1 中仅昄了以的形式输出 DOM ?wi);然后可以使用q个作?SAX 处理器的输入?BR> 清单 1. ?DOM 转换成输出流Q供 SAX 使用Q? import org.apache.xerces.parsers.DOMParser; import org.apache.xml.serialize.XMLSerializer; import org.xml.sax.InputSource; import org.w3c.dom.Document;
public class PrintDOMTree {
public static void main(String[] args) { try { InputSource source = new InputSource(args[0]); DOMParser parser = new DOMParser(); parser.parse(source); Document doc = parser.getDocument();
XMLSerializer serializer = new XMLSerializer(); // Insert your PipedOutputStream here instead of System.out! serializer.setOutputByteStream(System.out); serializer.serialize(doc); } catch (Exception e) { e.printStackTrace(); } }
}
?DOM ?JDOM ?DOM 转换?JDOM 要比?DOM 转换?SAX 单。这事实上很有意义,因ؓ(f)(zhn)一旦有?DOM ?wi),有可能有机会(x)?SAX 处理数据。事实上Q很有 SAX 最优处?DOM ?wi)的情况Q因为?zhn)通过 DOM 表示来将 XML 存储在内存里Ӟ已经用尽了内存。更为常见的工作是把作ؓ(f) DOM ?wi)?XML 文档转换?JDOM ?wi)。由于这些格式都是文档表C,但在行ؓ(f)和功能性方面有潜在的不同,所以?zhn)可能惌其他人用?zhn)的 DOM ?wi)ƈ它当?JDOM q行处理。?zhn)可能认?f)q是他们的工作,但?zhn)需要知道(臛_Q)如何从?zhn)的结构{换成他们的结构?BR> 对于?DOM 转换?JDOMQJDOM API 向用h供了 DOM NodeQ称?org.jdom.input.DOMBuilder。这个类接受 DOM DocumentQ以及其它一?DOM l构Q如 Element ?AttrQ,q将 DOM ?wi){换成 JDOM Document。这个操作ƈ不复杂,所以我在清?2 中简单地昄了该代码Q让(zhn)了解一下实际过E?BR> 清单 2. ?DOM 转换?JDOM
// Java imports import java.io.IOException; // JDOM imports import org.jdom.JDOMException; import org.jdom.input.DOMBuilder; import org.jdom.output.XMLOutputter; // SAX and DOM import org.xml.sax.InputSource; // Xerces import org.apache.xerces.parsers.DOMParser; publicclass DOMtoJDOM { // DOM tree of input document org.w3c.dom.Document domDoc; public DOMtoJDOM(String systemID) throws Exception { DOMParser parser =new DOMParser(); parser.parse(new InputSource(systemID)); domDoc = parser.getDocument(); } public org.jdom.Document convert() throws JDOMException, IOException { // Create new DOMBuilder, using default parser DOMBuilder builder =new DOMBuilder(); org.jdom.Document jdomDoc = builder.build(domDoc); return jdomDoc; } publicstaticvoid main(String[] args) { try{ DOMtoJDOM tester =new DOMtoJDOM(args[0]); org.jdom.Document jdomDoc = tester.convert(); // Output the document to System.out XMLOutputter outputter =new XMLOutputter(); outputter.output(jdomDoc, System.out); }catch (Exception e) { e.printStackTrace(); } } }
没有别的要说了。一旦?zhn)知道如何?DOM Ud SAX ?JDOM 之后Q就可以解决M(zhn)需要的输出格式q且能够处理(zhn)将遇到的许多类型的 XML 表示。静?DOM U别 3 规范Q以了解对于以标准的且与供应商无关的方式输出 DOM ?wi)的更改Q到那时Q?zhn)可以尽情?DOM 了!
public static final java.lang.String METHOD 可以设ؓ(f)"xml"?html"?text"{倹{? public static final java.lang.String VERSION 所遵@规范的版本号,如果METHOD设ؓ(f)"xml",那么它的值应该设?1.0",如果METHOD设ؓ(f)"html",那么它的值应该设?4.0",如果METHOD设ؓ(f)"text",那么q个输出属性会(x)被忽略? public static final java.lang.String ENCODING 讄输出时所采用的编码方?比如"GB2312"?UTF-8"{等,如果其讄?GB2312",可以解决所谓的"汉字问题"? public static final java.lang.String OMIT_XML_DECLARATION 讄输出到XML文档中时是否忽略XML声明,亦即cM?
q样的代码。它可选的值有"yes"?no"? public static final java.lang.String INDENT IDENT讑֮XSLT引擎在输出XML文档?是否自动d额外的空?它可选的gؓ(f)"yes"?no"? public static final java.lang.String MEDIA_TYPE MEDIA_TYPE讑֮输出文档的MIMEcd? 如果讑֮XSLT引擎的输出属性呢?下面我们来ȝ一?
首先是获取XSLT引擎(Transformerc?的缺省输出属性的集合,q需要用TransformercȝgetOutputProperties()Ҏ(gu),q回值是一个java.util.Properties对象?BR> Properties properties = transformer.getOutputProperties(); 然后是设定新的输出属?比如: properties.setProperty(OutputKeys.ENCODING,"GB2312"); properties.setProperty(OutputKeys.METHOD,"html"); properties.setProperty(OutputKeys.VERSION,"4.0"); ……………………………………………………?BR> 最后是更新XSLT引擎(Transformerc?的缺省输出属性的集合,q需要用TransformercȝsetOutputProperties()Ҏ(gu),参数是一个java.util.Properties对象?BR> 我们~写了一个新的程?其中应用了OutputKeysc?用以控制XSLT引擎的输出属?该程序的架构和前一个程?AddRecord3.java)大致相同,不过输出l果略有不同。完整的代码请参考下列文? AddRecord3.java(见附?、user.xml(见附?。该例子的运行环境ؓ(f):Windows XP Professional、JDK 1.3.1。ؓ(f)了能够正常编译运行AddRecord3.javaq个E序,你需要到|址http://java.sun.com/M载安装JAXP 1.1或者Java XML Pack(Java XML Pack内含JAXP??BR> Ҏ(gu)?使用Xalan XML Serializer