在jQuery中的XML文档中选择和操作DOM中的元素?

时间:2014-12-24 14:13:02

标签: javascript jquery xml object dom

我想从jQuery中的XML文档的DOM中选择元素

这是我到目前为止(XML通常来自另一个来源而不是字符串,但在这种情况下这并不相关):

var $xml = prepareXml('<measurement date="24/12/14" ammonia="0" nitrite="0" nitrate="20"></measurement><measurement date="25/12/14" ammonia="0" nitrite="1" nitrate="40"></measurement><measurement date="26/12/14" ammonia="1" nitrite="4" nitrate="55"></measurement>');

function prepareXml(string) {
    var string_xml = string;
    var xml_doc = $.parseXML(string_xml);
    var $xml = $(xml_doc);
    return $xml;
}

我尝试做的事情是这样的:

$('measurement').each( function() {
    var date = $(this).attr('date');
    var ammonia = $(this).attr('ammonia');
    [...]
});

等...

如何从属性中选择元素并访问XML文档中的DOM,而不是运行javascript的HTML页面。

2 个答案:

答案 0 :(得分:1)

您的$xml变量只能填充$(string)


然后您可以使用$xml作为上下文。

$('measurement', $xml).each(...)

或等效的$xml.find('measurement')

但是,一个好主意是在live xml中有一个根元素,因为.find和上下文方式)将与第一级上的那些不匹配。 (除非您使用.filter

答案 1 :(得分:1)

您的代码的第一个问题是您的数据不是有效的XML。有效的XML文档必须具有一个顶级元素,但您的字符串在顶层有多个measurement元素。在以下示例中,我将它们包装在foo元素中。这有效:

var xml = '<foo><measurement date="24/12/14" ammonia="0" nitrite="0" nitrate="20"></measurement><measurement date="25/12/14" ammonia="0" nitrite="1" nitrate="40"></measurement><measurement date="26/12/14" ammonia="1" nitrite="4" nitrate="55"></measurement></foo>';

var $xml = $($.parseXML(xml));

$('measurement', $xml).each(function () {
  console.log(this.tagName);
});

请注意,使用$($.parseXML(xml))与执行$(xml) 通常不等同。使用parseXML时,创建的DOM树是一个实际的XML文档,其中包含XML节点。它们的语义与HTML节点不同。使用$(xml)时,您正在创建HTML DOM树。一个区别是,如果您选中tagName字段。在XML文档中,它区分大小写并准确反映XML源中的内容。在HTML文档中,它被标准化为大写。另一个区别是如果序列化节点。例如,一般,带有空元素的HTML树不会使用<name/>表示法序列化元素,但是XML树会。