javascript - 如果 xml 节点中没有值,如何让我的小部件不崩溃?

标签 javascript xml return-value yahoo-widgets

我正在获取一个 xml 文件并希望从中获取数据。 xml 的来源并不重要,但我必须获得某个字段的是:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

现在这就像一个魅力,除非节点中没有值。所以如果结构是这样的:

<xml>
 <one>
  <two>nodeValue</two>
 </one>
 <one>
  <two></two>
 </one>
</xml>

小部件将在第二个“one”节点上崩溃,因为“two”节点中没有值。控制台显示:

TypeError: tracks.item(i).childNodes.item(4).childNodes.item(0) has no properties

关于如何让小部件将空视为空字符串(null、空或“”)而不是崩溃,有什么想法吗?我猜测可能是数据getValue()文本或其他内容。

使用

var track= xmlDoc.getElementsByTagName('track')[0];
var info= track.getElementsByTagName('artist')[0];
var value= info.firstChild? info.firstChild.data : '';

不起作用并返回“TypeError:轨道没有属性”。这是第二行调用艺术家的地方。

最佳答案

在访问“two”节点的数据之前,测试其是否有子节点。

childNodes.item(i)(或 JavaScript 简单形式 childNodes[i])通常应该避免,它有点脆弱,依赖于空白文本节点位于确切的预期位置。

我会做这样的事情:

var tracks= xmlDoc.getElementsByTagName('track')[0];
var track= tracks.getElementsByTagName('one')[0];
var info= track.getElementsByTagName('two')[0];
var value= info.firstChild? info.firstChild.data : '';

(如果你事先不知道'one'和'two'的标签名,你可以使用'getElementsByTagName('*')'来获取所有元素,只要你不需要支持IE5,这不起作用。)

最后一行的替代方法是使用一种方法来读取节点内的所有文本,包括其任何子节点。如果节点最多只包含一个 Text 节点,这并不重要,但如果树可以非规范化或包含 EntityReferences 或嵌套元素,则这可能很有用。过去,人们必须编写一个递归方法来获取此信息,但现在大多数浏览器都支持 DOM Level 3 textContent 属性和/或 IE 的 insideText 扩展:

var value= info.textContent!==undefined? info.textContent : info.innerText;

关于javascript - 如果 xml 节点中没有值,如何让我的小部件不崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/671861/

相关文章:

javascript - js中创建属性触发异常 'not a function'

java - 在 Android 中更改主题 (Android Studio)

rust - 从函数返回特征

javascript - 仅具有特定角色的命令

javascript - Google map API place.url 返回 "undefined"?

javascript - 如何在不更改其他属性的情况下更改 ul 中 li 的文本?

python - Scrapy Spider解析器调用函数

c# - 非常大的字符串到字节数组

c++ - 在 C++ 中使用错误代码的更好方法是什么?

c++ - 堆栈 std::vector 作用域