2

我有以下代码试图获取 c:CreationDate 节点:

 value = '<?xml version="1.0" encoding="UTF-8"?><content><c:CreationDate>2010-09-04T05:04:53Z</c:CreationDate></content>';

 xml = (new DOMParser()).parseFromString(value, 'text/xml');

 console.log(xml.getElementsByTagName('c:CreationDate'));

不幸的是,它返回的是一个空数组,而不是带有 xml 中节点的数组。我认为这是由于“:”符号引起的。

有没有办法逃脱它?

注意:请不要建议在 childNodes 或类似的东西上使用。这对我不起作用,因为我的 xml 验证复杂(这里只是一个示例)并且将来很可能会发生变化,我只能依赖标签名称。

谢谢!

4

1 回答 1

11

cinc:CreationDate表示XML 命名空间前缀。命名空间前缀只是命名空间的快捷方式。命名空间必须在文档中的某处使用xmlns:c属性进行定义。但是在您的文档中缺少命名空间定义。

所以它应该看起来像:

var value = '<?xml version="1.0" encoding="UTF-8"?>' +
            '<content>' +
            '  <c:CreationDate xmlns:c="http://my.namespace">2010-09-04T05:04:53Z</c:CreationDate>' +
            '</content>';

或者

var value = '<?xml version="1.0" encoding="UTF-8"?>' +
            '<content xmlns:c="http://my.namespace">' +
            '  <c:CreationDate>2010-09-04T05:04:53Z</c:CreationDate>' +
            '</content>';

在此示例中,前缀c被分配给命名空间http://my.namespace。该CreationDate标记以 为前缀c,因此它属于命名空间http://my.namespace

然后您可以使用命名空间感知getElementsByTagNameNS()函数来查询 CreationDate 元素:

console.log(xml.getElementsByTagNameNS('http://my.namespace', 'CreationDate'));

作为第一个参数,您必须传递真实的命名空间名称而不是前缀。

于 2010-11-26T21:09:30.323 回答