﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-一切从实用出发!-随笔分类-jaxp xml</title><link>http://www.blogjava.net/fool/category/12689.html</link><description>坚持就是胜利!</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 17:37:26 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 17:37:26 GMT</pubDate><ttl>60</ttl><item><title>观察者模式:从任意数据结构生成XML解析器产生SAX事件</title><link>http://www.blogjava.net/fool/archive/2006/08/07/62110.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Mon, 07 Aug 2006 01:16:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2006/08/07/62110.html</guid><wfw:comment>http://www.blogjava.net/fool/comments/62110.html</wfw:comment><comments>http://www.blogjava.net/fool/archive/2006/08/07/62110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fool/comments/commentRss/62110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fool/services/trackbacks/62110.html</trackback:ping><description><![CDATA[在j2ee1.4标准教材里看到一个很有趣的例子,从任意数据结构生成XML解析器产生SAX事件.数据结构可以是文本文件,PDF格式文档等.关键是自己解析这些数据源.另外一个有意思的地方是观察者模式的应用.所以就粗糙的改了一下并完整到可以测试运行.观察者模式简略UML图: 
<p align="left"><img height="246" alt="observer.jpg" src="http://www.blogjava.net/images/blogjava_net/fool/observer.jpg" width="351" border="0" /><br />具体实现 被观察者对象ParseXMLSubject类:<br />package test;</p><p align="left">import java.io.*;<br />import org.xml.sax.helpers.AttributesImpl;<br />import org.xml.sax.*;</p><p align="left">public class ParseXMLSubject implements XMLReader {<br />    ContentHandler handler;</p><p align="left">    String nsu = "";<br />    Attributes atts = new AttributesImpl();<br />    String rootElement = "addressbook";<br />    String indent = "\n    ";</p><p align="left">    public ParseXMLSubject(){</p><p align="left">    }</p><p align="left">    public ContentHandler getContentHandler() {<br />        return handler;<br />    }</p><p align="left">    public void parse(InputSource input) throws IOException, SAXException {<br />        try {<br />            // Get an efficient reader for the file<br />            java.io.Reader r = input.getCharacterStream();<br />            BufferedReader br = new BufferedReader(r);</p><p align="left">            // Read the file and display it's contents.<br />            String line = br.readLine();</p><p align="left">            while (null != (line = br.readLine())) {<br />                if (line.startsWith("email:")) {<br />                    break;<br />                }<br />            }</p><p align="left">            if (handler == null) {<br />                throw new SAXException("No content handler");<br />            }</p><p align="left">            // Note:<br />            // We're ignoring setDocumentLocator(), as well<br />            handler.startDocument();<br />            handler.startElement(nsu, rootElement, rootElement, atts);</p><p align="left">            output("email",  line);<br />            line = br.readLine();<br />            output("html", line);<br />            line = br.readLine();<br />            output("firstname",  line);<br />            line = br.readLine();<br />            output("lastname", line);<br />            line = br.readLine();<br />            output("work",  line);<br />            line = br.readLine();<br />            output("home", line);<br />            line = br.readLine();<br />            output("fax",  line);<br />            line = br.readLine();<br />            output("pager", line);<br />            line = br.readLine();<br />            output("cell",  line);<br />            handler.ignorableWhitespace("\n".toCharArray(), 0, // start index<br />                                        1 // length<br />                    );<br />            handler.endElement(nsu, rootElement, rootElement);<br />            handler.endDocument();<br />        } catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />    }</p><p align="left"><br />    public void parse(String systemId) throws IOException, SAXException {<br />    }</p><p align="left"><br />    public DTDHandler getDTDHandler() {<br />        return null;<br />    }</p><p align="left"><br />    public EntityResolver getEntityResolver() {<br />        return null;<br />    }</p><p align="left"><br />    public ErrorHandler getErrorHandler() {<br />        return null;<br />    }</p><p align="left"><br />    public boolean getFeature(String name) throws SAXNotRecognizedException,<br />            SAXNotSupportedException {<br />        return false;<br />    }</p><p align="left"><br />    public Object getProperty(String name) throws SAXNotRecognizedException,<br />            SAXNotSupportedException {<br />        return null;<br />    }</p><p align="left"><br />    public void setContentHandler(ContentHandler handler) {<br />        this.handler = handler;<br />    }</p><p align="left">    public void setDTDHandler(DTDHandler handler) {<br />    }</p><p align="left"><br />    public void setEntityResolver(EntityResolver resolver) {<br />    }</p><p align="left"><br />    public void setErrorHandler(ErrorHandler handler) {<br />    }</p><p align="left"><br />    public void setFeature(String name, boolean value) throws<br />            SAXNotRecognizedException, SAXNotSupportedException {<br />    }</p><p align="left"><br />    public void setProperty(String name, Object value) throws<br />            SAXNotRecognizedException, SAXNotSupportedException {<br />    }</p><p align="left">    void output(String name, String line) throws SAXException {<br />        int tmp = name.length();<br />        int startIndex=tmp+1;<br />        int textLength = line.length() - startIndex;<br />        String characters = line.substring(startIndex,line.length()-1);<br />        handler.ignorableWhitespace(indent.toCharArray(), 0, // start index<br />                                    indent.length());<br />        handler.startElement(nsu, name, name /*"qName"*/, atts);</p><p align="left">        handler.characters(characters.toCharArray(), startIndex, textLength);<br />        handler.endElement(nsu, name, name);<br />    }</p><p align="left">}<br /><br />具体观察者对象: ConcreateObserver类<br />package test;</p><p align="left">import org.xml.sax.helpers.DefaultHandler;<br />import org.xml.sax.*;<br />public class ConcreateObserver extends DefaultHandler {<br />    public ConcreateObserver() {<br />    }</p><p align="left">    public void startElement(String uri,<br />                         String localName,<br />                         String qName,<br />                         Attributes attributes)<br />                  throws SAXException{<br />              System.out.println("startElement: "+localName);<br />          }<br />          public void characters(char[] ch,<br />                                 int start,<br />                                 int length)<br />                throws SAXException{<br />            System.out.println("characters: ");<br />            System.out.print(ch);<br />            System.out.println();<br />        }<br />}<br /><br />测试类:TestMain <br />package test;<br />import java.io.*;<br />import org.xml.sax.InputSource;<br />public class TestMain {<br />    public TestMain() {<br />    }</p><p align="left">    public static void main(String[] args) throws Exception {<br />        TestMain testmain = new TestMain();<br />        FileReader in = new FileReader(new File("d:\\AddressBookReaderLog01.txt"));</p><p align="left">        ConcreateObserver observer=new ConcreateObserver();<br />        ParseXMLSubject parse = new ParseXMLSubject();<br />        parse.setContentHandler(observer);</p><p align="left">        parse.parse(new InputSource(in));<br />    }<br />}<br /><br />测试文本文档:AddressBookReaderLog01.txt<br /><br />AddressBookReader01 ../samples/PersonalAddressBook.ldif<br />nickname: Fred<br />email: <a href="mailto:fred@barneys.house">fred@barneys.house</a><br />html: TRUE<br />firstname: Fred<br />lastname: Flintstone<br />work: 999-Quarry<br />home: 999-BedrockLane<br />fax: 888-Squawk<br />pager: 777-pager<br />cell: 555-cell</p><p align="left">另外一个也比较也有意思的地方就是具体观察者类从DefaultHandler 继承,该类是缺省适配器模式的应用.<br />欢迎加入QQ群:30406099 </p><img src ="http://www.blogjava.net/fool/aggbug/62110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2006-08-07 09:16 <a href="http://www.blogjava.net/fool/archive/2006/08/07/62110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAXP dom 构建带名称空间的xml文档</title><link>http://www.blogjava.net/fool/archive/2006/07/03/56236.html</link><dc:creator>傻  瓜</dc:creator><author>傻  瓜</author><pubDate>Mon, 03 Jul 2006 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/fool/archive/2006/07/03/56236.html</guid><wfw:comment>http://www.blogjava.net/fool/comments/56236.html</wfw:comment><comments>http://www.blogjava.net/fool/archive/2006/07/03/56236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fool/comments/commentRss/56236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fool/services/trackbacks/56236.html</trackback:ping><description><![CDATA[
		<p> 网上好象关于如何构建支持名称空间的xml文档的资料似乎并不多 刚好啃过一下这方面的类容 也就借<br />Blog贴点,权当自己做了个笔记 .</p>
		<p> 先简要介绍一下用到的类及其方法,更详细的介绍只有看java api文档了      <br />DocumentBuilderFactory创建DOM解析器的工厂 调用其newInstance()方法实例化 然后用该实例创建DocumentBuilder<br />实例 该实例表示一个dom解析器         <br /> DocumentBuilderFactory.setNamespaceAware(true); 提供对 XML 名称空间的支持。<br />DOMImplementation  允许用户用根Element的限定名称和XML命名空间创建新Document<br />Document createDocument(String namespaceURI,String qualifiedName,     DocumentType doctype)throws DOMException创建具有文档元素的指定类型的 DOM Document 对象。<br />  参数：  namespaceURI - 要创建的文档元素的名称空间 URI 或 null。  qualifiedName - 要创建的文档元素的限定名称或 null。<br />  doctype - 要创建的文档的类型或 null。当 doctype 不是 null 时，其 Node.ownerDocument 属性将被设置为正在创建的文档。 <br />返回：具有文档元素的新 Document 对象。如果 NamespaceURI、qualifiedName 和 doctype 为 null，则返回的 Document 为空的，不带有文档元素<br />Element getDocumentElement()这是一种便捷属性，该属性允许直接访问文档的文档元素的子节点。<br />Element createElementNS(String namespaceURI, String qualifiedName)  throws DOMException创建给定的限定名称和名称空间 URI 的元素。依据 [XML Namespaces]，如果应用程序不希望使用名称空间，则必须将 null 作为方法的 namespaceURI 参数的值。 <br />参数：namespaceURI - 要创建的元素的名称空间 URI。qualifiedName - 要实例化的元素类型的限定名称。 返回：具有以下属性的新 Element 对象： 属性 值 Node.nodeName qualifiedName Node.namespaceURI namespaceURI Node.prefix 前缀，从 qualifiedName 中提取的；如果没有前缀，则为 null  Node.localName 本地名称，从 qualifiedName 提取的 Element.tagName qualifiedName </p>
		<p>Document对象的createAttributeNS Attr createAttributeNS(String namespaceURI,       String qualifiedName)   throws DOMException创建给定的限定名称和名称空间 URI 的属性。对于每个 [XML Namespaces]，如果应用程序希望没有名称空间，则它们必须将 null 作为方法的 namespaceURI 参数的值。 参数：namespaceURI - 要创建的属性的名称空间 URI。qualifiedName - 要实例化的属性的限定名称。</p>
		<p>Element对象的setAttributeNS方法 void setAttributeNS(String namespaceURI, String qualifiedName,    String value)                throws DOMException   throws DOMException 添加新属性 namespaceURI - 要创建或更改的属性的名称空间 URI。qualifiedName - 要创建或更改的属性的限定名称。value - 以字符串形式设置的值。 </p>
		<p>import javax.xml.parsers.*;<br />import org.w3c.dom.*;<br />import javax.xml.transform.*;<br />import javax.xml.transform.stream.*;<br />import javax.xml.transform.dom.*;</p>
		<p>class BuilderXML {<br />    public final static String SOAP_NS =<br />            "<a href="http://schemas.xmlsoap.org/soap/envelop/">http://schemas.xmlsoap.org/soap/envelop/</a>";<br />    public final static String MH_NS =<br />            "<a href="http://com.163.hc/myxml">http://com.163.hc/myxml</a>";<br />    public final static String XSD_NS = "<a href="http://www.w3c.org/2001/XMLSchema">http://www.w3c.org/2001/XMLSchema</a>";<br />    public final static String XSI_NS =<br />            "<a href="http://www.w3c.org/2001/XMLSchema-instance">http://www.w3c.org/2001/XMLSchema-instance</a>";<br />    public static void main(String[] args) throws Exception {<br />        BuilderXML builderxml = new BuilderXML();</p>
		<p>        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br />        <br />     <br />        factory.setNamespaceAware(true);<br />        DocumentBuilder builder = factory.newDocumentBuilder();</p>
		<p>       <br />        DOMImplementation doIml = builder.getDOMImplementation();<br /> </p>
		<p>        Document doc = doIml.createDocument(SOAP_NS, "soap:Envelop", null);<br />        <br />        <br />        Element root = doc.getDocumentElement();</p>
		<p>        root.setAttribute("xmlns:soap", SOAP_NS);<br />        root.setAttribute("xmlns:mh", MH_NS);<br />        root.setAttribute("xmlns:xsd", XSD_NS);<br />        root.setAttribute("xmlns:xsi", XSI_NS);<br />        </p>
		<p>        Element body = doc.createElementNS(SOAP_NS, "soap:Body");<br />        root.appendChild(body);<br />        Element getBookPrice = doc.createElementNS(MH_NS, "mh:getBookPrice");<br />        body.appendChild(getBookPrice);<br />        Element isbn = doc.createElementNS(MH_NS, "isbn");<br />        body.appendChild(isbn);<br />        Attr typeAttr = doc.createAttributeNS(XSI_NS, "xsi:type"); //attr 只能赋给element<br />        typeAttr.setValue("xsd:string");<br />        isbn.setAttributeNodeNS(typeAttr);<br />        isbn.setAttributeNS( MH_NS,"mh:tt","tt");</p>
		<p>        //创建CDATA段<br />        CDATASection cdata=doc.createCDATASection("&lt;hc&gt;ttt&lt;/hc&gt;");<br />          isbn.appendChild(cdata);<br />         // 创建文本<br />          Text tt = doc.createTextNode("made  two by hc");<br />          isbn.setNodeValue("made by hechang");<br />          isbn.appendChild(tt);<br />        Text text = doc.createTextNode("0311111");<br />        body.appendChild(text);<br />         //创建注释<br />        Comment comment = doc.createComment(" written by hc ");<br />        doc.insertBefore(comment,root);<br />         //创建转换器并将xml文档输出到输出流 如果输出流是一个输出文件流,则生成一个文件<br />        Transformer t = TransformerFactory.newInstance().newTransformer();<br />        t.setOutputProperty("indent", "yes"); //设置空白输出</p>
		<p>        t.transform(new DOMSource(doc),<br />                    new StreamResult(System.out));</p>
		<p>
				<br />    }<br />}<br /><br />程序输出:<br />&lt;soap:Envelop xmlns:soap="<a href="http://schemas.xmlsoap.org/soap/envelop/">http://schemas.xmlsoap.org/soap/envelop/</a>" <br />xmlns:mh="<a href="http://com.163.hc/myxml">http://com.163.hc/myxml</a>"<br /> xmlns:xsd="<a href="http://www.w3c.org/2001/XMLSchema">http://www.w3c.org/2001/XMLSchema</a>"<br /> xmlns:xsi="<a href="http://www.w3c.org/2001/XMLSchema-instance">http://www.w3c.org/2001/XMLSchema-instance</a>"&gt;<br />&lt;soap:Body&gt;<br />&lt;mh:getBookPrice/&gt;<br />&lt;isbn mh:tt="tt" xsi:type="xsd:string" xmlns="<a href="http://com.163.hc/myxml&quot;&gt;&lt;![CDATA[&lt;hechang&gt;ttt&lt;/hechang&gt;]]&gt;made">http://com.163.hc/myxml"&gt;&lt;![CDATA[&lt;hechang&gt;ttt&lt;/hechang&gt;]]&gt;made</a>  two by hechang&lt;/isbn&gt;0311111&lt;/soap:Body&gt;<br />&lt;/soap:Envelop&gt;<br /><br />                                                                                                                                欢迎加入QQ群:30406099 </p>
<img src ="http://www.blogjava.net/fool/aggbug/56236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fool/" target="_blank">傻  瓜</a> 2006-07-03 09:10 <a href="http://www.blogjava.net/fool/archive/2006/07/03/56236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>