我正在使用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吗?
答案 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。 (这可能是一件好事。)