在Spring中通过Ajax调用获取Node对象

时间:2013-04-23 12:47:24

标签: java ajax spring jquery xml-parsing

我正在使用Spring和Ajax。通过Ajax我调用一个控制器方法,我在其中加载一个xml文件并解析它。我想将解析后的节点(Object)作为对Ajax调用的响应传递给html页面。

这是我的Ajax Call

$.ajax({
        url: "query1",
        type: "POST",
        //dataType: "xml",
        success: function(data) {
            alert("in jax response");
            alert("DATA" + data);
          // parseXml(data);
        }
    }); 

这是我的控制器方法

@RequestMapping(value = "/query1", method = RequestMethod.POST)
public @ResponseBody Node executeQuery1(ModelMap model) throws ParserConfigurationException, SAXException,IOException, XPathExpressionException {
        // Standard of reading a XML file
          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          factory.setNamespaceAware(true);
          DocumentBuilder builder;
          Document doc = null;
          XPathExpression expr = null;
          builder = factory.newDocumentBuilder();
          String filepath = "C:\\test.xml";
          System.out.println("PATH: " + filepath);
          doc = builder.parse(filepath);

          // Create a XPathFactory
          XPathFactory xFactory = XPathFactory.newInstance();

          // Create a XPath object
          XPath xpath = xFactory.newXPath();

        // Compile the XPath expression
          expr = xpath.compile("//person[@id=1]");
          // Run the query and get a nodeset
          Object result = expr.evaluate(doc, XPathConstants.NODE);

          // Cast the result to a DOM NodeList
          Node personNode = (Node) result;
          model.addAttribute("xmlnode", personNode);
          System.out.println("model set. going to return");
         return personNode;

    }

如果我返回一个字符串而不是Node,我会收到警告弹出窗口。但是在返回Node Object时失败了。

另外,我想在Javascript中进一步解析这个节点。所以请让我知道最好的方法。我应该将Node转换为XML String并返回XML String吗?

2 个答案:

答案 0 :(得分:0)

您可以对要返回的对象使用JSON格式。例如,使用Jackson JSON API,您可以将对象转换为JSON格式并作为String返回。或者,如果您想使用XML,请将Node对象转换为XML表示形式并作为String返回。使用XML作为String,您需要相应地在AJAX代码中解析它。

答案 1 :(得分:0)

(我之前的版本假设您将XML从客户端传递到服务器)。

您无法按原样传递DOM节点。它不会使用toString方法序列化。

要传递DOM子树,您需要将其解析回XML。 "Writing Out a DOM as an XML File"上的Java Tutorial页面有一个例子,可以完成你想要做的事情。寻找标题“编写DOM的子树”。 (唯一的区别是您的代码使用XPath而不是DOM API来定位您想要的节点。)

或者,您可以通过遍历DOM树“手动序列化”您的节点,将内容提取到新的(非DOM)对象中,然后以某种方式序列化这些对象。例如,您可以构造JSONObject / JSONArray实例,然后序列化为JSON。您在客户端获得的不是XML。 (这可能是一件好事。)