使用jQuery将XML文档转换回字符串

8

我正在尝试解析一个XML格式的字符串,删除其中一个元素,并将其写回到字符串中。所有这些都使用标准的jQuery函数完成。但是最后一步似乎我无法解决。

var $xml = $(somexmlstring);
var element = $xml.find('name:contains("'+somevalue+'")');
element.remove();
var newxmlstring = $xml.dunno(); 

我可以使用什么函数将 $xml DOM 转换回字符串?
使用 PHP 中的 `saveXML()` 函数可以将 $xml DOM 对象转换为字符串。
4个回答

6
为了帮助您在jsfiddle中修复代码:
var data = '<value><url>foo</url><name>bar</name></value><value><url>foo</url><name>bar</name></value>'
var xml = $.parseXML('<root>' + data + '</root>');
var $xml = $(xml);
console.log('xml', $xml.find('root').html());

解决方法在最后一行:`$xml.find('root').html()`。该行代码使用了HTML标签,无需解释。

然而,这在Internet Explorer中不起作用。浏览器会提示innerHTML没有.replace()属性... - Alexis Wilke
@AlexisWilke:这可能只是jQuery和IE的问题,与答案中的代码无关。 - RemyNL
我认为 XML 和 HTML 之间存在差异,而 html() 函数只能接受 HTML。当我尝试使用它处理真正的 XML 文档时(不仅仅是 HTML),我遇到了问题。这可能是因为其中一个标签被命名为 <title>,并且没有在名为 <head> 的标签中。 - Alexis Wilke
@AlexisWilke:我在 XML 和 HTML 之间的差异上遇到了很多挫折... 在 HTML 中使用标签,例如不应该有子元素但在 XML 中却有子元素(为什么不呢),在 jQuery 中会完全失控... 必须承认,在那个时候我们没有使用 $.parseXML... - RemyNL

3
如果您先用父元素包装jQuery对象,然后在父元素上调用.html(),就可以使用.html()
var $xml = $(somexmlstring);
$xml.find('name:contains("' + somevalue + '")').remove();
var newxmlstring = $('<x></x>').append($xml).html(); 

即使原始的XML字符串没有单个根元素,这也可以工作。但是,如果原始的XML字符串包含XML声明(例如<?xml version="1.0" encoding="UTF-8"?>),则无法工作。

jsfiddle


如果原始的XML字符串是一个有效的XML文档,可选地包含在开头的XML声明,您可能想要像这样创建jQuery对象:
var $xml = $($.parseXML(somexmlstring).documentElement);
$xml.find('name:contains("' + somevalue + '")').remove();
var newxmlstring = $('<x></x>').append($xml).html(); 

{{链接1:jsfiddle}}


我试了一下你的JSFiddle,但它仅返回第一个节点,而不是整个字符串:data != $xml.wrap('<x></x>').parent().html()。 - RemyNL
$.parseXML(data); 将失败,因为data不是正确的XML格式,它有多个节点,所以你需要先将字符串包装起来,然后解析结果为XML格式:var xml = $.parseXML('<root>' + data + '</root>'); - RemyNL
@RemyNL - 谢谢。我可能错过了fiddle无法工作的问题。问题出在使用.wrap()上。它会包装所有顶级节点。解决方法是改用.append()。您也正确指出$.parseXML()需要XML字符串具有单个根元素。 - John S

1

你不需要使用jQuery,可以使用XMLSerializer。

new XMLSerializer().serializeToString(xmlobj.documentElement);

0
只要你的XML文档不包含一些额外花哨的命名空间,那么它就很简单:
var newxmlstring = $xml.html(); 

这是我尝试的第一件事情之一,但我无法让它工作。http://jsfiddle.net/0x80/GwpQ5/3/ - Thijs Koerselman
我可以解析XML字符串,搜索节点等,但每当我调用html()函数时,它似乎会返回未定义。我可以调用text(),它将返回XML节点的内容,但不包含标签。 - Thijs Koerselman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接