使用Javascript提取整个XML节点内容
我们有一个webapp(标准SpringMVC,Java)——我已经写过了——它以XML的形式向我们的客户机(浏览器)返回响应。响应是使用JAXB等进行编组的 在ui中——为了与第三方软件交互,我们需要将部分XML原样传递到javascript方法中 即,从“”开始的所有内容都需要提取 经过无数次的尝试和调试,我得出结论,这是一种错误的方法。我认为我应该将响应的这一部分包装在CDATA中,并将其提取为 .text()在任何对象上。。。目前我们正在使用jquery。。。响应在AJAX调用中返回 但也许这是可以做到的。。目前,我们正在尝试对一个元素调用.html(),该元素作为其XML落入堆中 蒂亚 :-) 下面是“us”的响应结构应用程序数据和第三部分的“xml”。只需提取“…to”-中的(&包括),并按原样(文本字符串)传递给第三方方法使用Javascript提取整个XML节点内容,java,javascript,jquery,xml,Java,Javascript,Jquery,Xml,我们有一个webapp(标准SpringMVC,Java)——我已经写过了——它以XML的形式向我们的客户机(浏览器)返回响应。响应是使用JAXB等进行编组的 在ui中——为了与第三方软件交互,我们需要将部分XML原样传递到javascript方法中 即,从“”开始的所有内容都需要提取 经过无数次的尝试和调试,我得出结论,这是一种错误的方法。我认为我应该将响应的这一部分包装在CDATA中,并将其提取为 .text()在任何对象上。。。目前我们正在使用jquery。。。响应在AJAX调用中返回 但
<xml>
<someNode>
<ourStuff veryUseful="true"/>
<thirdPartyStuff a="1" b="2">
<moreStuff/>
<evenMoreStuff/>
</thirdPartyStuff>
</someNode>
</xml>
下面是一个失败的测试,基本上说明了我的无知。因此,console.log当然必须失败
实际上,数据是通过$.ajax()调用返回的,但是这个测试演示了这种行为。
它生成了一个“uncaughttypeerror:无法调用undefined的方法'replace'”——因为XML“节点”上没有innerHtml——我当然认为这是绝对正确的,并在jquery API文档中记录了这一点
注意-这对我来说在Windows上的Chrome&IE中是失败的,但在Firefox(Mac OS)上是有效的
<html>
<head>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
function hackit() {
var data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<xml>" +
"<thirdParty>" +
"<blah a=\"0\" b=\"0\">" +
"</blah>" +
"</thirdParty>" +
"</xml>";
$xmlData = $.parseXML(data);
$data = $($xmlData);
var thing = $data.find("thirdParty");
console.log(thing.html());
}
</script>
</head>
<body onload="hackit()">
Loaded.
</body>
</html>
函数hackit(){
var data=“”+
"" +
"" +
"" +
"" +
"" +
"";
$xmlData=$.parseXML(数据);
$data=$($xmlData);
var thing=$data.find(“第三方”);
log(thing.html());
}
加载。
我想我最终会走这条路
这里的答案对我很有用 (另见:) 我将花一些时间研究为什么这样做,但假设我们在节点上迭代,然后简单地序列化它们 总而言之,问题不是“提取”节点,而是获取选择的字符串表示形式(即序列化)的方法是错误的 在IE、FF和Chrome中使用下面的代码片段进行了测试,并获得了预期结果。现在,我们将把它推广到我们的应用程序中。已采用以下方法&现在正在我们的应用程序中工作
<html>
<head>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
function serializeXmlNode(xmlNode) {
if (typeof window.XMLSerializer != "undefined") {
return new window.XMLSerializer().serializeToString(xmlNode);
} else if (typeof xmlNode.xml != "undefined") {
return xmlNode.xml;
}
return "";
}
function hackit() {
var data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<xml>" +
"<ourStuff>" +
"<blah a=\"x\" b=\"y\">" +
"</blah>" +
"</ourStuff>" +
"<thirdParty>" +
"<blah a=\"0\" b=\"0\">" +
"</blah>" +
"</thirdParty>" +
"</xml>";
var xmlData = $.parseXML(data);
var thirdPartyNode = $(xmlData).find("thirdParty blah")[0];
console.log(serializeXmlNode(thirdPartyNode));
var ourNode = $(xmlData).find("ourStuff blah")[0];
console.log(serializeXmlNode(ourNode));
}
</script>
</head>
<body onload="hackit()">
Loaded.
</body>
</html>
函数序列化xmlNode(xmlNode){
if(typeof window.XMLSerializer!=“未定义”){
返回新的window.XMLSerializer().serializeToString(xmlNode);
}else if(typeof xmlNode.xml!=“未定义”){
返回xmlNode.xml;
}
返回“”;
}
函数hackit(){
var data=“”+
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"";
var xmlData=$.parseXML(数据);
var thirdPartyNode=$(xmlData).find(“第三方blah”)[0];
log(序列化xmlnode(thirdPartyNode));
var ourNode=$(xmlData).find(“ourStuff blah”)[0];
log(序列化xmlnode(ourNode));
}
加载。
Java!=Javascript:)更重要的是,XML!=HTML。使用JS在XML中检查并显示所需信息是有意义的,但是我不知道调用.html()会发生什么。也许你可以澄清一下你在这一步做什么?HTML是如何进入的?不是,他想得到someNode内容的字符串形式,以便发送。当然,最接近jQuery的方法是.html,因此他尝试了它;“目前,我们在尝试调用元素上的.html()时遇到了麻烦”。用XML调用.html()是什么?为什么?添加了一个工作。。。未能通过测试,说明我正在剥皮的树是错误的。:-)