如何使用Javascript/JQuery读取XML中d:EncodedAbsUrl属性值
解决带命名空间的XML元素读取问题
我来帮你搞定这个读取XML里d:EncodedAbsUrl和m:Properties的问题!你遇到的报错核心原因是这些元素带命名空间前缀(比如m:、d:),直接用常规的DOM属性访问或简单jQuery选择器会失效,下面给你两种靠谱的解决方式:
一、使用jQuery处理的正确写法
首先要注意:jQuery对带冒号的命名空间元素,需要用\\:转义冒号,或者通过nodeName属性筛选,而且不能直接把jQuery对象转成DOM后乱访问属性(你之前的pics[0].content就是踩了这个坑)。
假设你的XML结构大致是这样:
<feed xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <entry> <content type="application/xml"> <m:Properties> <d:EncodedAbsUrl>https://example.com/photo.jpg</d:EncodedAbsUrl> </m:Properties> </content> </entry> </feed>
方法1:转义命名空间冒号
// 找到所有entry元素(用jQuery对象操作,别直接转DOM) var $entries = $(xml).find("entry"); // 遍历每个entry $entries.each(function() { // 找到content下的m:Properties(注意冒号前加双反斜杠转义) var $properties = $(this).find("content m\\:Properties"); // 读取d:EncodedAbsUrl的文本值 var absUrl = $properties.find("d\\:EncodedAbsUrl").text(); console.log(absUrl); });
方法2:通过nodeName筛选(兼容性更好)
如果转义冒号的方式在某些环境下失效,可以用nodeName精确匹配元素:
var $entries = $(xml).find("entry"); $entries.each(function() { // 找到content下nodeName为m:Properties的子元素 var $properties = $(this).find("content").children().filter(function() { return this.nodeName === "m:Properties"; }); // 找到m:Properties下nodeName为d:EncodedAbsUrl的子元素 var absUrl = $properties.children().filter(function() { return this.nodeName === "d:EncodedAbsUrl"; }).text(); console.log(absUrl); });
二、使用原生JavaScript处理(更可靠)
原生JS的getElementsByTagNameNS方法可以直接根据命名空间URI和标签名查找元素,完全避开选择器转义的问题,这是处理带命名空间XML最稳妥的方式。
首先你需要知道这两个命名空间对应的URI(这是SharePoint XML的标准命名空间,应该和你的XML一致):
m:对应:http://schemas.microsoft.com/ado/2007/08/dataservices/metadatad:对应:http://schemas.microsoft.com/ado/2007/08/dataservices
代码示例:
// 先把XML字符串转换成DOM文档(如果还没转的话) var xmlDoc = new DOMParser().parseFromString(xml, "text/xml"); // 获取所有entry元素 var entries = xmlDoc.getElementsByTagName("entry"); for (var i = 0; i < entries.length; i++) { var entry = entries[i]; // 获取entry下的content元素 var content = entry.getElementsByTagName("content")[0]; // 通过命名空间URI获取m:Properties元素 var properties = content.getElementsByTagNameNS( "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", "Properties" )[0]; // 通过命名空间URI获取d:EncodedAbsUrl元素并读取文本 var absUrl = properties.getElementsByTagNameNS( "http://schemas.microsoft.com/ado/2007/08/dataservices", "EncodedAbsUrl" )[0].textContent; console.log(absUrl); }
为什么你的代码会报错?
你之前的写法pics[0].content['\m:properties']有两个关键错误:
pics[0]是DOM元素,它的content是DOM的内置属性(通常为null),不是XML里的<content>子元素,所以会出现Cannot read property 'm:properties' of undefined。- 即使找到正确的
<content>元素,直接访问properties也不行,因为它是带m:命名空间的元素,不是常规的DOM属性或无命名空间子元素。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

