要读取我使用的子节点内容:
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 <b> text <b>
答案 0 :(得分:1)
是,不,取决于你的解析器。原因是因为XML中的所有文本节点都假设具有&lt;和&gt;替换为htmlentity()
对应的人,并将所有其他特殊字符替换为htmlspecialchars()
。我很确定它会创建一个新节点,并以HTML标记作为名称。
对此唯一的解决方案是将XML数据存储到字符串中,使用正则表达式取出HTML标记(以及所有&lt;和&gt;字符),并用正确的值替换它们我在上面提到过,在将它传递给解析器(javascript中为parser.parseFromString()
之前,假设'解析器'是一个DOM解析器)。另一种方法是获取节点,然后使用递归循环获取整个节点的子节点集,然后将它们的名称和内容连接在一起。第二种方法是更多的编程工作,涉及更多的处理,我建议简单的补救正则表达式和替换字符。
或者,您可以阅读有关CDATA here的信息,并通过将所有内容放在![CDATA[]
标记中来转义标记,但如果您是创建该XML文件的那个,那就是这样。您应该通知网站管理员您从中获取XML的网站,错误地创建了XML,并且标签需要使用![CDATA[]
标记进行转义,或者替换为&lt;和&gt;和他们的htmlentity()
同行。我想您也可以使用正则表达式将HTML代码放在![CDATA[]
标记内,但这可能比替换&lt;和&gt;标签
答案 1 :(得分:0)
官方W3C元素属性从元素及其所有后代返回所有文本是DOM v3的一部分并称为textContent,但它并不是每个浏览器都支持(我正在看着你IE;我认为它在那里被称为innerText) - 如果这甚至与你相关。
因此,对于您的XML代码段,您的代码行看起来像这样:
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);
否则你必须编写一个循环来复制每个节点(文本内容也是一个节点,就像空格一样)从源到目的地并将其附加到那里。