Javascript 如何从同时包含CDATA和xml的节点读取单个xml节点

Javascript 如何从同时包含CDATA和xml的节点读取单个xml节点,javascript,xml,xpath,cdata,xmldom,Javascript,Xml,Xpath,Cdata,Xmldom,我有个问题。我有几个随机包含CDATA和reqular xml节点的xml文件。我需要阅读这些节点的内容,但不确定如何确定该节点是普通xml节点、CDATA节点还是包含两者的混合节点,其中开头和结尾的CDATA部分可以包含任何内容。(如果有帮助,我将使用xPath引用我的节点) 用于检索节点的文本内容的行: contentObj.text = contentNode.selectSingleNode("./text").text; 导致问题的xml示例: <text> &

我有个问题。我有几个随机包含CDATA和reqular xml节点的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>

]> 需要更新

]>
当你说

contentNode.selectSingleNode("./text")
这当然返回
元素节点;但是当你要求

.text
属性,则需要整个
元素的文本内容,该元素是其所有后代文本节点值的串联

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

contentNode.selectSingleNode("./text/text()[1]").text;
即,选择
元素的第一个文本节点子节点,然后检索其文本属性。在您的示例中,这将为您提供

(作为未分析的文本,而不是XML树)

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

var children = contentNode.selectNodes("./text/node()");
它将选择
元素的所有子元素的
节点列表,包括文本节点、元素节点以及可能的CDATA节点。遍历
子节点
中的节点,检查它们的
节点类型
属性,查看它是
节点CDATA\u节
节点文本
,还是其他内容

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

编辑 从你接受这个答案的事实来看,我认为你能够让事情顺利进行,我很高兴你能够做到

然而,我不想不强调@choroba所暗示的警告就放弃这一点:CDATA包装器(围绕文本块)对于大多数XML工具是不可见的(尽管文本内容是可见的)。XML数据模型(非正式描述)对CDATA部分一无所知。XML信息集的标准—关于CDATA标记的区域边界的信息

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

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

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

]> ...

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


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

CDATA只是引用文本的另一种方式。它始终是文本节点的一部分。我知道CDATA是透明的,然后我调用node.text,但是在上面的xml中,如果我调用node.text,我不仅会得到CDATA中包含的前两行,还会得到任何非CDATA节点的文本值。我需要能够分离示例中的CDATA XML CDATA混合,或者至少能够识别节点包含CDATA,因为它可能不在完整XML结构的其他迭代中。您无法区分CDATA部分及其周围的文本。如果它们之间有某种东西(元素),你可以。您将哪个节点称为node.text?请注意,如果有多个文本节点,XPath可以返回节点列表。contentObj.text=contentNode。选择SingleNode(“./text”).text;它检索封装在文本节点的CDATA节中的文本,但是由于某些未知原因,同一节点中存在其他xml节点,但是它们不在CDATA节中。什么是
(./text/text())[1]
(./text/text())[2]
etc.return?在我创建的每个XML文档中,cdata与任何其他节点都不共享同一个节点。喜欢和别人创造的东西一起工作。遗憾的是,我正在解析的创建原始数据导出(openXML规范)的软件来自一个成熟的组织,我来这里是为了了解数据导出的“混乱”方式,以便从咨询中获得额外收入。感谢您的指导。由于我仍在学习某些编程实践,像您这样的帖子确保了我不会学习坏的实践。我只希望当我变得更好的时候,我能够通过指导回馈社会