科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java SE6新特性: XML API 与Web服务4

Java SE6新特性: XML API 与Web服务4

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

文章主要介绍 Java SE 6 在 API 库方面的部分新特性,通过一些例子和讲解,帮助开发者在编程实践当中更好的运用 Java SE 6,提高开发效率。

作者:沈羽 来源:IT专家网 2008年5月9日

关键字: API XML Java SE 6 java

  • 评论
  • 分享微博
  • 分享邮件
清单 6. 地址信息文件

  

work contact-info
Location Shanghai-shuion-333
Postal 200020
Tel
fix 63262299
mobile 1581344454
Appellation Mr. Wang

  清单 7 为这个信息文件构造一个 DOM 树,并将其作为 transformer 的输入。

  清单 7. 构造 DOM 树 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

class ContentHandler extends DefaultHandler {

    @Override
    public void characters(char[] ch, int start, int length)
throws SAXException {
String name = new String(ch, start, length);
        System.out.print(name + "\t");
    }
}

public class DOMTest {

    /**
    * @param args
    * @throws TransformerException
    */
    public static void main(String[] args) {

        try {
            DocumentBuilderFactory documentfactory = DocumentBuilderFactory
                .newInstance();
            DocumentBuilder builder = documentfactory.newDocumentBuilder();
            Document document = builder.newDocument();

            Element root = document.createElement("work-contact-info");

            Element loca = document.createElement("Location");
            loca.setTextContent("Shanghai-shuion-333");
            root.appendChild(loca);

            Element postal = document.createElement("Postal");
            postal.setTextContent("200020");
            root.appendChild(postal);

            Element tel = document.createElement("Tel");
            root.appendChild(tel);

            Element fix = document.createElement("fix");
            fix.setTextContent("63262299");
            tel.appendChild(fix);

            Element mobile = document.createElement("mobile");
            mobile.setTextContent("1581344454");
            tel.appendChild(mobile);

            Element appellation = document.createElement("Appellation");
            appellation.setTextContent("Mr. Wang");
            root.appendChild(appellation);

            document.appendChild(root);

            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer;
            transformer = tFactory.newTransformer();
            SAXResult result = new SAXResult();

            ContentHandler cHandler = new ContentHandler();
    result.setHandler(cHandler);
            transformer.transform(new DOMSource(document), result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 Java SE 6 SDK 提供了至少以上三种内置的处理 XML 文件的机制。它们分别是 Simple API for XML、Document Object Model 和 Streaming API for XML。其中 SAX 和 StAX 采用了相似的模型 —— 将 XML 文件建模为元素流,DOM 采用了树形模型。带来的结果是 SAX 和 StAX 运行时空间相对 DOM 紧凑。状态保持能力则依次 SAX -> StAX -> DOM 变强。特别值得一提的是 StAX 技术是最新引进的 XML 处理技术,它结合了 SAX 和 DOM 的优点。清单 8 给出了一个粗略度量 SAX、StAX、DOM 三个框架解析同一个 XML 文件的运行效率的代码。

  清单 8. 度量 XML 解析框架的运行时间

  

public class StAXTest {

    public static void main(String[] args) {
        final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
    "<work-contact-info>" +
"<Location>Shanghai-shuion-333</Location>" +
"<Postal>200020</Postal>" +
"<Tel><fix>63262299</fix>" +
"<mobile>1581344454</mobile></Tel>" +
"<Appellation>Mr. Wang</Appellation>" +
"</work-contact-info>";
        for (int i = 0; i < 10000; i++) {
            StAX(xml);
        }

        for (int i = 0; i < 10000; i++) {
            SAX(xml);
        }

        for (int i = 0; i < 10000; i++) {
            DOM(xml);
        }

        long current = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            StAX(xml);
        }
        current = System.currentTimeMillis() - current;
        System.out.println(current);

        current = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
SAX(xml);
        }
        current = System.currentTimeMillis() - current;
        System.out.println(current);

        current = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
DOM(xml);
        }
        current = System.currentTimeMillis() - current;
            System.out.println(current);
    }

    private static void StAX(final String xml) {
        XMLInputFactory inputFactory = XMLInputFactory.newInstance();
        InputStream input;
        try {
            input = new ByteArrayInputStream(xml.getBytes());
XMLEventReader xmlEventReader = inputFactory
                .createXMLEventReader(input);
            while (xmlEventReader.hasNext()) {
                XMLEvent event = xmlEventReader.nextEvent();

                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                }

                if (event.isCharacters()) {
                    Characters text = event.asCharacters();
                    if (!text.isWhiteSpace()) {
                    }
                }
            }
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }

    private static void SAX(final String xml) {
        SAXParserFactory f = SAXParserFactory.newInstance();
        InputStream input;
        try {
            SAXParser p = f.newSAXParser();
            input = new ByteArrayInputStream(xml.getBytes());
            p.parse(input, new DefaultHandler());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void DOM(final String xml) {
        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        InputStream input;
        try {
            DocumentBuilder p = f.newDocumentBuilder();
            input = new ByteArrayInputStream(xml.getBytes());
            p.parse(input);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

      得出的数据如下:

2734
4953
6516

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章