当你说
contentNode.selectSingleNode("./text")
这当然返回<text>
元素节点;但是当你要求
.text
它的属性,您要求的是整个<text>
元素的文本内容,它是其所有后代文本节点的值的串联。
如果要选择单个文本节点,请尝试
contentNode.selectSingleNode("./text/text()[1]").text;
即选择<text>
元素的第一个文本节点子节点,然后检索其文本属性。这应该"<P align=center> </P> <P align=center>"
在您的示例中为您提供(作为未解析的文本,而不是 XML 树)。
为了区分 CDATA 和非 CDATA,您必须使用 XPath,它的设计目的不是能够区分它们。另一方面,XML DOM 可以,至少在某些实现中是可以的。所以你可以试试
var children = contentNode.selectNodes("./text/node()");
这将选择元素nodeList
的所有子<text>
元素中的一个,包括文本节点、元素节点和可能的 CDATA 节点。遍历其中的节点children
并检查它们的nodeType
属性以查看它是NODE_CDATA_SECTION
、NODE_TEXT
还是其他东西。
让我们知道进展如何,以及您是否需要进一步的帮助。
编辑
我假设你接受了这个答案,你能够让事情正常进行,我很高兴你能够做到。
但是,我不想在不强调@choroba 所暗示的警告的情况下放弃这一点:CDATA 包装器(围绕一块文本)对大多数 XML 工具是不可见的(尽管文本内容是可见的)。XML 数据模型(此处非正式地描述)对 CDATA 部分一无所知。XML Infoset 的标准明确省略了有关 CDATA 标记部分的边界的信息。
因此,虽然您这次“走运了”,因为您使用了确实提供有关 CDATA 部分的信息的 XML DOM,但依赖该信息以 XML 编码重要数据是违反 XML 的精神(因此是不明智的)。因此,您最好以其他方式对该信息进行编码。否则,如果您需要对数据使用其他 XML 工具,您可能会遇到困难。
我认为您在这里尝试提取的重要信息是 CDATA 部分中的文本是转义标记。例如,它是不应该是(或不能是)XML 树的一部分的 HTML 标记。因此,您可以通过使用自定义元素包围每个标识来对该标识进行编码:
<text>
<escaped><![CDATA[<P align=center> </P>
<P align=center>]]></escaped>
<media identifier="005896523">
...
然后为了在将来找到这些部分,您所要做的就是查找名为 的元素<escaped>
,这对于任何 XML 工具来说都是一项简单而自然的任务。
我不知道这些 XML 文件的设计是否在您的控制之下。如果没有,您至少应该可以选择向设计师发送反馈。如果不精通 XML 的设计人员犯了设计错误,了解它符合他们的最大利益,以便他们能够纠正它,或者至少在未来的设计中避免同样的错误。如果您在一个指挥链下工作,并且 XML 的设计者在不同的部门,则反馈的适当途径可能是通过您的主管。了解他们是否正在生产不可移植的 XML 设计符合该部门的最大利益。