【问题标题】:How, with javascript, can i read Childnode content on an XML file that contains html tags如何使用 javascript 读取包含 html 标签的 XML 文件中的 Childnode 内容
【发布时间】:2011-06-02 00:59:40
【问题描述】:

要读取我使用的子节点内容:

MYDATA = xhr.responseXML.getElementsByTagName("MenuItem")[INDEX].getElementsByTagName("PageContent")[0].childNodes[0].nodeValue;

有时当 childNode 数据包含 HTML 标签(例如 <b><br> 标签)时,我会遇到问题,因为它们被视为 XML 标签(如子节点)。

我的问题是如何从子节点获取整个数据,即使它包含其他html标签

例子:

<MenuItem> 
    <MenuText>menu <b> text <b><MenuText>
</MenuItem >

会返回“菜单”,但我希望它返回:menu &lt;b&gt; text &lt;b&gt;

【问题讨论】:

  • 可能需要编辑您的问题以使示例标签正确显示。请参阅editing help
  • 另外,如果您可以控制数据源,则应考虑使用 CDATA 将 HTML 编写为文本内容而不是文字节点。
  • 谢谢你,一个例子会很受欢迎,我还在学习。 (我编辑了我的标签,现在它们是可见的)
  • CDATA 看起来像这样:&lt;root&gt;&lt;MenuItem&gt;&lt;MenuText&gt;&lt;![CDATA[&lt;b&gt;text&lt;/b&gt;]]&gt;&lt;/MenuText&gt;&lt;/MenuItem&gt;&lt;/root&gt;。这样,您将获得代表 MenuTextnode 并请求 firstChild(CDATA 文本节点),然后获得其 nodeValue

标签: javascript html xml dom


【解决方案1】:

是的,也不是,取决于您的解析器。这样做的原因是因为 XML 中的所有文本节点都假定将 替换为对应的 htmlentity(),并且所有其他特殊字符都替换为 htmlspecialchars()。我相当确定它创建了一个新节点,名称为 HTML 标记。

唯一的两个解决方案是将 XML 数据存储到一个字符串中,使用正则表达式取出 HTML 标记(好吧,所有的 字符),并用我记下的正确值替换它们上面,在你将它传递给解析器之前(parser.parseFromString() 在 javascript 中,假设“解析器”是一个 DOM 解析器)。另一种是取节点,然后使用递归循环获取整个节点的子节点集合,然后将它们的名称和内容串联起来。第二种方法编程工作量大,处理量大,我建议用正则表达式和字符替换的简单补救方法。

或者,您可以阅读有关 CDATA here 的信息,并转义标签,方法是将所有内容放在 ![CDATA[] 标签中,但前提是您是创建该 XML 文件的人。您应该通知网站管理员您从中获取 XML,XML 创建不正确,并且需要使用 ![CDATA[] 标记转义标记,或者将 替换为对应的 htmlentity()。我想您也可以使用正则表达式将 HTML 代码放在 ![CDATA[] 标记中,但这可能比替换 标记更慢且效率更低。

【讨论】:

    【解决方案2】:

    从一个元素及其所有后代返回所有文本的官方 W3C 元素属性是 DOM v3 的一部分,称为 textContent,但尚未在每个浏览器中都支持它(我在看你的 IE;我认为它是称为 innerText 那里) - 如果这甚至与你相关。

    所以你的代码行对于你的 XML sn-p 看起来像这样:

    MYDATA = xhr.responseXML.getElementsByTagName("MenuItem")[INDEX].getElementsByTagName("MenuText")[0].textContent;
    

    但它不会保留 HTML 标签。所以最终这取决于你试图用那个 XML 做什么。是否要将其添加到另一个 DOM 树?如果是这样,您可以将该元素及其所有后代元素附加到其他位置。

    MYDATA = xhr.responseXML.getElementsByTagName("MenuItem")[INDEX].getElementsByTagName("MenuText")[0].cloneNode(true);
    someOtherElement.appendChild(MYDATA);
    

    否则,您必须编写一个循环,将每个节点(文本内容也是一个节点,就像空白一样)从源复制到目标并将其附加到那里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多