【问题标题】:JavaScript failing when parsing XML that has blanks in nodeValues?解析 nodeValues 中有空格的 XML 时 JavaScript 失败?
【发布时间】:2019-08-28 13:49:13
【问题描述】:

我有一个应用程序,它使用 Javascript 解析从 Web 服务返回的 XML 数组,并对其进行迭代并将其构建到表体中。直到最近它一直没有问题。

我们对 Web 服务从其中返回结果的数据库进行了一些更改,其中现在有一些列可能包含空白或空值。

当遇到具有空白或空值的 childNode 时,Javascript 无法运行。

以下是浏览器错误的快照:

所以我的问题是如何处理这些空白,以便 Javascript 将在表体中构建一个空字符串并继续遍历 xml 数组?

我尝试在 for 循环中的 Javascript 中构建一个 if 语句,以用 '' 替换空白或 null 值,但我不确定它是否可以通过构建表体的方式来实现。

for (i = 0; i < x.length; i++) {
tbody += "<tr><td class=col1>" +
x[i].getElementsByTagName("CheckInDate")[0].childNodes[0].nodeValue  +
"</td><td class=col2>" +
x[i].getElementsByTagName("CheckOutDate")[0].childNodes[0].nodeValue +
"</td><td class=col3>" +
x[i].getElementsByTagName("CheckInOut")[0].childNodes[0].nodeValue +
"</td><td>" +
x[i].getElementsByTagName("address")[0].childNodes[0].nodeValue +
"</td><td>" +
x[i].getElementsByTagName("names")[0].childNodes[0].nodeValue +
"</td><td>" +
x[i].getElementsByTagName("companyName")[0].childNodes[0].nodeValue +
"</td><td>" +
x[i].getElementsByTagName("Name")[0].childNodes[0].nodeValue.substr +
"</td><td>" +
x[i].getElementsByTagName("contactPhoneNum")[0].childNodes[0].nodeValue +
"</td ></tr >";
}

作为一个现有的应用程序,我不想重建使用这种方法构建表的所有函数,所以我希望有一个我没有看到的简单解决方案。

【问题讨论】:

  • “运行失败”是什么意思?是否报告了错误?
  • 请分享浏览器控制台错误,我建议您使用 map 与 join 或 reduce 来获得这个 html 字符串

标签: javascript xml xml-parsing


【解决方案1】:

问题是如果 XML 元素没有任何内容(任何文本节点),.childNodes 将是 null。您似乎有很多重复代码,要解决此问题,您可以创建一个函数来获取具有特定标记名称的 XML 节点的内容(如果它有任何内容或返回空字符串)。

这是一个例子:

function getElementContent(element, tagName) {
  const e = element.getElementsByTagName(tagName);
  if (e && e.childNodes && e.childNodes.length) {
    return e[0].childNodes[0].nodeValue
  }
  return '';
}

const tbody = x.map(e => `<tr><td class=col1>${getElementContent(e, 'CheckInDate')}</td><td class=col2>${getElementContent(e, 'CheckInDate')}..... `).join('');

【讨论】:

  • Titus,这完全有道理,我理解你的例子。对我来说棘手的地方是我将它嵌套在一个 for 循环中,该循环遍历整个数组并构建 tbody。您的建议只获取一条记录,但我想我可以将其保留在 for 循环中,然后一遍又一遍地调用您的函数,直到循环完成。
  • @ChisumTrail 我的示例循环遍历x 的所有元素。我已经编辑了我的答案,使 tbody 成为一个字符串而不是一个字符串数组。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 2018-09-24
  • 2019-08-17
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多