我想从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页面。
答案 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树会。