http://dev.csdn.net/article/45/45443.shtm
这些API是XSLT的关键部分,它们构建在DOM和SAX解析器基础上。 Sun在XML领域总是后知后觉,等到Sun重视XML的时候,XML的API早就满天 飞了,尤其是IBM具有非常大的领先优势。不过Sun是规范的制订者,于是参考W 具体来说JAXP包括了几个工厂类,这就是JDK1.4里面的javax.xml.parsers 包,用来寻找符合DOM标准的XML API实现类的位置;此外JAXP还包括一整套interface,这就是JDK1.4里面的org.w 当你严格采用JAXP编程的时候,是遵循W
JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器 JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Crimson DOM/SAX 解析器 JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Xerces DOM/SAX 解析器 W jdom 相当于上面的 JAXP接口 + Xerces DOM实现部分,它本身没有解析器,它可以使用Xerces或者Crimson的解析器 jdom应用程序 -> jdom API -> Xerces/Crimson解析器 dom4j应用程序 -> dom4j API -> Xerces/Crimson解析器 dom4j应用程序 -> dom4j API -> Alfred2解析器 因此可以看出采用dom4j/jdom编写的应用程序,已经不具备可移植性了。 Sun是JAXP标准的制订者,甚至很执著的在JDK1.4里面绑定Crimson DOM实现和解析器,然后可笑的是,Sun自己的JAXM RI竟然不是用JAXP写出来的,而是dom4j 我的举例: 1. 仅仅是XSL转换。XMLàHTML,通过XSL Import javax.xml.transform.TransformerFactory; Import javax.xml.transform.Transformer; Import javax.xml.stream.StreamSource; Import javax.xml.stream.StreamResult; import java.io.FileOutputStream; TransformerFactory transFactory = TransformerFactory.newInstance(); Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName)); Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL))); 这里的stream是一个DOM对象。 我感觉这个就是JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器,不知道对不对。
2.遍历XML,通过DOM。不仅仅是XSL转换。中间有对XML元素内容的操作。 Import javax.xml.transform.TransformerFactory; Import javax.xml.transform.Transformer; Import javax.xml.stream.StreamSource; Import javax.xml.stream.StreamResult; import java.io.FileOutputStream; //Xerces解析器来完成DOM遍历XML.DOMParser是Xerces包的一部分。 Import org.apache.xerces.parsers.DOMParser; Import org.w Import org.w //DOM遍历XML DOMParser parser = new DOMParser(); Parser.parse(XMLFileName);//解析并在内存中创建XML树。 Document document = parser.getDocument();//通过Document对象,可以使用内存中的树。 NodeList products = document.getElementByTagName(“product_id”); Int num_products = products.getLength(); //XSL转化器 TransformerFactory transFactory = TransformerFactory.newInstance(); Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName)); Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL))); 我感觉XSL转化和对XML对象的操作是两个过程。可以分别对待。最重要的是对对象的操作。这也就是为什么有DOM,JDOM,DOM4J。转化好像只需要JAXP就可以了,关心的是StreamSource和StreamResult。这两个是DOM对象。
3.JDOM使用,生成Document内容并保存到XML文件。 import org.jdom.Element;
import org.jdom.Document;//和Import org.w import org.jdom.output.XMLOutputter;
Element root = Element(“orders”); root.addContent(“ ”); org.jdom.Document document = new Document(root);//创建JDOM树。 FileOutputStream outStream = new FileOutputStream(XMLFileName); XMLOutputter outToFile = new XMLOutputter(); outToFile.output(document,outStream); outStream.flush(); outStream.close(); jdom应用程序 -> jdom API -> Xerces/Crimson解析器 VS
JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器
这里的没有Transform的过程,直接把Document的内容存到XML中。没有XSL转化,没有XSL文件。 JDOM提供了几种输出方法。这里XMLOutputter是保存到文件,输出一个实际的XML流。还有DOMOutputter,在内存中创建一个传统的DOM树。还有SAXOutputter,创建一串SAX事件以便被其他对象读取。
4.JDOM使用,读取已有的XML然后生成Document,修改Document import org.jdom.Element;
import org.jdom.Document; import org.jdom.output.XMLOutputter;
import org.jdom.input.SAXBuilder;
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(XMLFileName);
Element order = Element(“orders”); orders.addAttribute(“order_id”,session_id); Element root = document.getRootElement();//root是已经存在的根元素。 Root.addContent(order);//在根元素里增加orders元素。 //把document保存到文件中。 FileOutputStream outStream = new FileOutputStream(XMLFileName); XMLOutputter outToFile = new XMLOutputter(); outToFile.output(document,outStream); outStream.flush(); outStream.close(); 即使创建一个DOM式的结构,这里仍使用SAXBuilder来做这这件事情。 DOMBuilder和SAXBuilder中的”DOM”和”SAX”指的是用于建立文档的方法,而不是生成的内容。
5.XSL转换,能把DOM对象转化成输出,也可以向上面所举例的把XMLFileName的流转化成输出的流(文件或屏幕显示)。但是不能把JDOM对象转化,所以需要把JDOM转化成DOM对象,然后再输出。 import org.jdom.Element;
import org.jdom.Document; import org.jdom.output.XMLOutputter;
import org.jdom.input.SAXBuilder;
//XSL转化需要的包
import org.jdom.output.DOMOutputter;//对比org.jdom.output.XMLOutputter; Import javax.xml.transform.TransformerFactory; Import javax.xml.transform.Transformer; Import javax.xml.transform.DOMSource;//对比Import javax.xml.stream.StreamSource; Import javax.xml.stream.StreamResult;
org.w
DOMOutputter DomOut = DOMOutputter();
DOMDoc = DomOut.output(org.jdom.Document);//把jdom的document转化成DOM的document
TransformFactory transFactory = TransformFactory.newInstance();
Transformer transformer = transFactory.newTransformer(new DOMSource(DOMDoc));//感觉错了,应该是XSL文件。 Transformer.transform(new DOMSource(DOMDoc),new StreamResult(out));
//对比以前的转化,是从文件到文件,现在是DOM树到屏幕输出。 TransformerFactory transFactory = TransformerFactory.newInstance(); Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName)); Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));
刚学习XML,发现内容实在是太丰富了,仅仅是API就弄得有点乱。这篇文是我的第一个blog。呵呵! |
|