如何在jQuery中通过DOM查询XML字符串

我想取一个字符串并将其视为XML。 然后我将能够通过jQuery.find与DOM进行查询。 在Firefox中一切都运行良好,但我意识到这在IE中不起作用。

我这样做:

var t = "
abcdef
"; alert("[" + $(t).find("outer").html() + "]");

在Firefox 3中它打印:

 [abcdef] 

在IE 7中它打印:

 [] 

有什么办法让这个跨浏览器工作?

谢谢。

有两种方法可以解决这个问题。

  1. 将XML字符串转换为DOM,使用此插件解析它或遵循本教程
  2. 使用此插件将XML转换为JSON。

是否可以将XML存储为JSON(我认为它会是)? 例如,在PHP中,您可以将XML转换为Array或Object,然后使用json_encode将其转换为JSON。 然后你可以将它作为一个javascript变量回应如下:

在PHP中:

 abcdef
"; $xml_object = simplexml_load_string(xml); $json = json_encode($xml_object); ?>

现在,无论何时需要访问该数据,您都可以这样做:

 function some_function() { var data = $(document).data('myapp.data'); $.each(data.div.outer,function() { // Would alert 'abc' then 'def' alert(this.inner); }); } 

我希望所有这些都有意义。 至少你不必再担心客户端上的XML了。 当然,如果你绝对需要,我发现这对我来说过去很有用:

 var xml = "
abcdef
"; var $xml = $('
').append(xml); alert("[" + $xml.find("outer").html() + "]");

编辑我修改了我的代码以使用您提供的实际XML – 不知道我在哪里混合(必须从其他人的意外事件的答案中获取片段)。 你应该真的给我的第一个建议 – 它应该工作。

将XML字符串放入Javascript变量:

 var xmlString = $(''); 

现在,您可以通过遍历每个客户节点来解析XML:

 $(xmlString).find("Customer").each(function () { var customerName = $(this).attr("Name"); var age = $(this).attr("Age"); var contactNumber = $(this).attr("ContactNumber"); var address = $(this).attr("Address"); var city = $(this).attr("City"); var country = $(this).attr("Country"); }); 

首先,jQuery构造函数使用HTML而不是XML ……也就是说,您的XML可能会起作用 – 但它取决于许多依赖于浏览器的行为。 此外,您可以通过将新创建的元素附加到页面上某个隐藏元素然后尝试查询它来获得更好的成功:

 var xml = "Title"; $(xml).appendTo("#hidden"); alert($("#hidden books").length); 

在Javascript for Selenium中读取浏览器中的XML文件:

 function loadXMLFromDOM2XMLString( xmlString, xmltag, currentChildNode ) { var nodes = currentChildNode.childNodes; var i = 0 ; var node = nodes[i]; while ( i < nodes.length) { if (node.data == null) {xmltag = '<'+node.localName+'>';} else {xmltag = node.data;}; xmlString = xmlString + xmltag; xmlString = loadXMLFromDOM2XMLString( xmlString, xmltag, node ); if (node.data == null) {xmltag = '<'+'/'+node.localName+'>';} else {xmltag = "";}; xmlString = xmlString + xmltag; i++; node = nodes[i]; } return xmlString ; } ; var xmlString = ""; var xmltag = ""; var currentChildNode = window.document; xmlString = loadXMLFromDOM2XMLString( xmlString, xmltag, currentChildNode ); xmlString; 

使用字符串xml即需要使用.filter,因为它不想识别xml节点树。

在ie8中尝试使用调试器可见以获取控制台输出。

那么,不是将XML数据集存储在DOM中,而是将其转换为HTML表并使其不可见。 这应该解决jQuery问题……至少是浏览器特定的问题。 然后回到改进你的选择器的工作。

已经有一段时间了,但我刚刚意识到我忘了发布我是如何用你的想法解决问题的。

我需要一个完全客户端数据库(没有PHP)。

我创建了一个带有HTML注释的div,其中包含XML。 我用这个解析了HTML注释,然后用这个 将XML转换为JSON 。

  var xmltext = $("#piecelist").comments(); var json = $.xml2json(xmltext.html()); 

你可以在这里看到我的方法: http : //wesculpt.net/art.html

也许我应该把这个方法变成一个jQuery插件。

感谢大家的帮助。