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

在Google App Engine/Java Servlet上有哪些用于处理XML的库,java,xml,eclipse,servlets,Java,Xml,Eclipse,Servlets,我正在Eclipse中编写一个Java(托管在Google App Engine上),需要处理一个XML文档。有哪些库可以很容易地添加到Eclipse项目中并具有良好的示例代码?Xerces(提供SAX和DOM实现)和Xalan(提供转换支持)-从1.5开始,这两个版本都与JDK捆绑在一起,因此已经在标准Java安装中进行了配置我想这取决于您的目标是什么。我曾经使用过将xml编组/反编组为Java对象,它相当快速,易于扩展,并且具有良好的社区支持 如果您不想开始编写模式之类的东西,那么我很幸运,

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

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

我想这取决于您的目标是什么。我曾经使用过将xml编组/反编组为Java对象,它相当快速,易于扩展,并且具有良好的社区支持


如果您不想开始编写模式之类的东西,那么我很幸运,它的学习曲线更小。

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

您可以使用与在非servlet环境中使用的库完全相同的库。

另一种选择,它比Xerces的速度更快(我最后一次比较它们)是。

我最终使用了SAXAPI

在我的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();

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

import javax.xml.parsers.DocumentBuilder;
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;
    }
导入javax.xml.parsers.DocumentBuilderFactory; 导入javax.xml.parsers.parserConfiguration异常; 导入org.w3c.dom.Document; 导入org.xml.sax.InputSource; 导入org.xml.sax.SAXException; 公共无效数据集(HttpServletRequest请求、HttpServletResponse响应) 抛出IOException{ 字符串内容=req.getParameter(“内容”); 文档doc=parseXml(内容); 分别为setContentType(“文本/普通”); 如果(doc!=null) { 分别是getWriter().println(doc.getDocumentElement().getNodeName()); } 其他的 { resp.getWriter().println(“无输入/错误的xml输入。请发送参数content=”); } } 私有静态文档parseXml(字符串strXml) { 单据单据=空; 弦杆; 尝试 { DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); DocumentBuilder db=dbf.newDocumentBuilder(); StringReader=新的StringReader(strXml); InputSource InputSource=新的InputSource(读卡器); doc=db.parse(inputSource); 退货单; } 捕获(ioe异常ioe) { strError=ioe.toString(); } 捕获(ParserConfiguration异常pce) { strError=pce.toString(); } 捕获(SAXSE异常) { strError=se.toString(); } 捕获(例外e) { strError=e.toString(); } log.severy(“parseXml:+strError”); 返回null; }
AppEngine提供的JVM不是标准的Java安装。你知道它是否可用吗?嗨,山姆-我没有使用Google AppEngine,但快速扫描文档表明它只是Java 6,有一些安全限制。看看这里-AppEngine目前不支持Xerces。安全问题。哎呀,我想处理XML;我不想自己写任何东西,所以JAXB已经过时了。你也可以使用注释来标记你想绑定到的对象。我个人没有使用过这种方法,但它可以节省你编写模式的时间。我承认JAXB对于很多应用程序来说很容易被过度使用。