Javascript 如何从同时包含CDATA和xml的节点读取单个xml节点
我有个问题。我有几个随机包含CDATA和reqular xml节点的xml文件。我需要阅读这些节点的内容,但不确定如何确定该节点是普通xml节点、CDATA节点还是包含两者的混合节点,其中开头和结尾的CDATA部分可以包含任何内容。(如果有帮助,我将使用xPath引用我的节点) 用于检索节点的文本内容的行: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> &
contentObj.text = contentNode.selectSingleNode("./text").text;
导致问题的xml示例:
<text>
<![CDATA[<P align=center> </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> </P>
<P align=left> </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> </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规范)的软件来自一个成熟的组织,我来这里是为了了解数据导出的“混乱”方式,以便从咨询中获得额外收入。感谢您的指导。由于我仍在学习某些编程实践,像您这样的帖子确保了我不会学习坏的实践。我只希望当我变得更好的时候,我能够通过指导回馈社会