Google App Engine/Java Servlet有哪些用于处理XML的库?

6

我正在使用Eclipse编写一个Java servlet(将在Google App Engine上托管),需要处理一个XML文档。有哪些库可以轻松添加到Eclipse项目中,并且具有良好的示例代码?

8个回答

5

我最终使用了SAX API和JAXP

在我的servlet中添加以下内容:

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

....

InputStream in = connection.getInputStream();

InputSource responseXML = new InputSource(in);
final StringBuilder response = new StringBuilder();
DefaultHandler myHandler = new DefaultHandler() {

    public void startElement(String uri, String localName, String qName, 
            Attributes attributes) throws SAXException {
        if (localName.equals("elementname")) {
            response.append(attributes.getValue("attributename"));
            inElement = true;
        }
    }
    public void characters(char [] buf, int offset, int len) {
        if (inElement) {
            inElement = false;
            String s = new String(buf, offset, len);
            response.append(s);
            response.append("\n");
        }
    }
};

SAXParserFactory factory = SAXParserFactory.newInstance();
try {
    SAXParser parser = factory.newSAXParser();
    parser.parse(responseXML, myHandler);
} catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

in.close();
connection.disconnect();

....

2
您可以使用需要xerces SAXParser的JDOM。但是,AppEngine不提供xerces库。您可以通过将其复制到项目的WEB-INF / lib文件夹中来添加它。

2

Xerces(提供SAX和DOM实现)和Xalan(提供转换支持)-自1.5版起已经与JDK捆绑在一起,因此已经在标准Java安装中进行了配置。


1
App Engine提供的JVM不是标准的Java安装程序。您知道它们是否可用吗? - Sam Hasler
嗨,Sam - 我没有使用过Google App Engine,但是快速浏览文档表明它只是带有一些安全限制的Java 6。请在这里查看 - http://code.google.com/appengine/docs/whatisgoogleappengine.html - Nick Holt
Xerces目前不受AppEngine支持。存在安全问题。 - John John Pichler

2
取决于你的目标。我使用JAXB将XML编组/解组为Java对象,它非常快速、易于扩展并且拥有良好的社区支持。
如果你不想涉及编写模式等方面,那么我使用dom4j也很成功,并且具有较小的学习曲线。

呸,我想处理XML;我不想自己写任何东西,所以JAXB不行。 - Sam Hasler
您也可以使用注解来标记要绑定的对象。我个人还没有使用过这种方法,但它会节省您编写模式的时间。我承认,对于许多应用程序,JAXB可能会过于复杂。 - Adam B

1
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;


    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        String content = req.getParameter("content");
        Document doc = parseXml(content);
        resp.setContentType("text/plain");
        if (doc != null)
        {
            resp.getWriter().println(doc.getDocumentElement().getNodeName());
        }
        else
        {
            resp.getWriter().println("no input/bad xml input. please send parameter content=<xml>");
        }
    }

    private static Document parseXml(String strXml)
    {
        Document doc = null;
        String strError;
        try
        {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();

            StringReader reader = new StringReader( strXml );
            InputSource inputSource = new InputSource( reader );

            doc = db.parse(inputSource);

            return doc;
        }
        catch (IOException ioe)
        {
            strError = ioe.toString();
        }
        catch (ParserConfigurationException pce)
        {
            strError = pce.toString();
        }
        catch (SAXException se)
        {
            strError = se.toString();
        }
        catch (Exception e)
        {
            strError = e.toString();
        }

        log.severe("parseXml: " + strError);
        return null;
    }

0
JDom的接口比标准的Java XML API更好(更简单)。

0

你可以在非servlet环境下使用完全相同的库。


0

另一个选择,比Xerces速度更快(上次我比较它们时)的是Saxon


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接