0

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

这是我的 Ajax 调用

$.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;

    }

如果我返回一个字符串而不是节点,我会收到警报弹出窗口。但是在返回节点对象时它失败了。

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

4

2 回答 2

0

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

于 2013-04-23T13:00:08.057 回答
0

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

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

要传递 DOM 子树,您需要将其解解析回 XML。“Writing Out a DOM as an XML File”的 Java 教程页面有一个示例,它几乎可以完成您正在尝试做的事情。查找标题“写出 DOM 的子树”。(唯一的区别是您的代码使用 XPath 而不是 DOM API 来定位您想要的节点。)

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

于 2013-04-23T13:05:04.890 回答