2

我有个问题。我有几个随机包含节点的 xml 文件,其中包含 CDATA 和 reqular xml 节点。我需要读取这些节点的内容,但我不确定如何确定该节点是普通 xml 节点、CDATA 节点还是包含两者混合的节点,其中开头和结尾的 CDATA 部分可能包含任何事物。(如果有帮助,我正在使用 xPath 来引用我的节点)

用于检索节点文本内容的行:

contentObj.text = contentNode.selectSingleNode("./text").text;

导致问题的 xml 示例:

<text>
     <![CDATA[<P align=center>&nbsp;</P>
          <P align=center>]]>
     <media identifier="005896523">
          <label>
               <![CDATA[NOTE]]>
          </label>
          <description>
               <![CDATA[Image for NOTE]]>
          </description>
          <comments>Update Required</comments>
     </media>
    <![CDATA[</P>
       <P>&nbsp;</P>
       <P align=left>&nbsp;</P>]]>
</text>
4

1 回答 1

1

当你说

contentNode.selectSingleNode("./text")

这当然返回<text>元素节点;但是当你要求

.text

它的属性,您要求的是整个<text>元素的文本内容,它是其所有后代文本节点的值的串联。

如果要选择单个文本节点,请尝试

contentNode.selectSingleNode("./text/text()[1]").text;

即选择<text>元素的第一个文本节点子节点,然后检索其文本属性。这应该"<P align=center>&nbsp;</P> <P align=center>"在您的示例中为您提供(作为未解析的文本,而不是 XML 树)。

为了区分 CDATA 和非 CDATA,您必须使用 XPath,它的设计目的不是能够区分它们。另一方面,XML DOM 可以,至少在某些实现中是可以的。所以你可以试试

var children = contentNode.selectNodes("./text/node()");

这将选择元素nodeList的所有子<text>元素中的一个,包括文本节点、元素节点和可能的 CDATA 节点。遍历其中的节点children并检查它们的nodeType属性以查看它是NODE_CDATA_SECTIONNODE_TEXT还是其他东西。

让我们知道进展如何,以及您是否需要进一步的帮助。

编辑

我假设你接受了这个答案,你能够让事情正常进行,我很高兴你能够做到。

但是,我不想在不强调@choroba 所暗示的警告的情况下放弃这一点:CDATA 包装器(围绕一块文本)对大多数 XML 工具是不可见的(尽管文本内容是可见的)。XML 数据模型(此处非正式地描述)对 CDATA 部分一无所知。XML Infoset 的标准明确省略了有关 CDATA 标记部分的边界的信息。

因此,虽然您这次“走运了”,因为您使用了确实提供有关 CDATA 部分的信息的 XML DOM,但依赖该信息以 XML 编码重要数据是违反 XML 的精神(因此是不明智的)。因此,您最好以其他方式对该信息进行编码。否则,如果您需要对数据使用其他 XML 工具,您可能会遇到困难。

我认为您在这里尝试提取的重要信息是 CDATA 部分中的文本是转义标记。例如,它是不应该是(或不能是)XML 树的一部分的 HTML 标记。因此,您可以通过使用自定义元素包围每个标识来对该标识进行编码:

<text>
     <escaped><![CDATA[<P align=center>&nbsp;</P>
          <P align=center>]]></escaped>
     <media identifier="005896523">
     ...

然后为了在将来找到这些部分,您所要做的就是查找名为 的元素<escaped>,这对于任何 XML 工具来说都是一项简单而自然的任务。

我不知道这些 XML 文件的设计是否在您的控制之下。如果没有,您至少应该可以选择向设计师发送反馈。如果不精通 XML 的设计人员犯了设计错误,了解它符合他们的最大利益,以便他们能够纠正它,或者至少在未来的设计中避免同样的错误。如果您在一个指挥链下工作,并且 XML 的设计者在不同的部门,则反馈的适当途径可能是通过您的主管。了解他们是否正在生产不可移植的 XML 设计符合该部门的最大利益。

于 2012-10-09T11:11:14.497 回答