【问题标题】:Why doesn't IXMLNode.IsTextElement return True for CDATA elements?为什么 IXMLNode.IsTextElement 不为 CDATA 元素返回 True?
【发布时间】:2011-12-07 14:31:26
【问题描述】:

我们正在使用 Delphi 2007 和 oxmldom Open XML 提供程序。

正常情况下的输入文件如下所示:

<root>
  <child>Some Text</child>
</root>

现在我们必须处理一个使用 CDATA 节点类型的输入文件:

<root>
  <child><![CDATA[Some special Text]]></child>
</root>

Node.IsTextElement 突然返回False,但Node.Text 仍按预期工作。

我知道IXMLNode.IsTextElement 只是一种方便的方法,但我觉得这种行为很奇怪。

作为一种解决方法,我们现在使用这种自定义方法:

class function TXmlUtils.IsTextOrCDataElement(ANode: IXMLNode): Boolean;
begin
  Result := False;
  if ANode.ChildNodes.Count = 0 then begin
    if ANode.NodeType in [ntText, ntCData] then begin
      Result := True;
    end;
  end else
  if ANode.ChildNodes.Count = 1 then begin
    if ANode.ChildNodes.First.NodeType in [ntText, ntCData] then begin
      Result := True;
    end;
  end;
end;

我的问题是:为什么IsTextElement 不适用于CDATA 节点,有没有更简单的解决方法?

【问题讨论】:

  • 但是... CDATA 元素不是 TEXT 元素,所以这种行为是正确的。您的解决方法似乎根本不是解决方法,而是实现了您期望的正确行为。
  • @RitsaertHornstra:您应该将其发布为答案以获得荣誉。
  • 所以Text 属性适用于不同类型的节点,而IsTextElement 只查找“TEXT”类型的节点?对吗?
  • 但是@Ritsaert,IsTextElement 方法 also 对于非文本节点返回 True。具体来说,对于具有单个文本节点子节点的元素,它返回 True,例如上面示例中的 &lt;child&gt;。因此,由于它已经不同于简单的 is 或 Supports 测试,Jens 关于为什么它不为 other 类似文本的节点返回 True 的问题是合理的。
  • @Rob Kennedy - 在IsTextElement 中有Element 字。 是 Element,其中包含 Text 节点。从字面上看,对我来说,这个功能一切都很好。

标签: xml delphi delphi-2007


【解决方案1】:

它不会为 Cdata 节点返回 true,因为这不是它的编写方式。不幸的是,XML 数据的消费者通常不应该关心 如何 文本在序列化数据中的表示方式。你的替代方案很好。

【讨论】:

  • 我接受了这个答案,因为它确认我做的是正确的事情,IsTextElement 确实不足以满足我们的要求。
【解决方案2】:

正如 Ritsaert Hornstra 在评论中所写,CDATA 不是 DOM 树的 TEXT 节点。它是 CDATA 节点。

Text 属性有所不同。例如。当前节点为属性时,Text 可能会返回该属性的值。

如果要检查当前节点是 CDATA 节点还是 TEXT 节点,只需使用 Delphi is 运算符。还有一些类似nodeType 的属性,您无论如何都在使用:-)

【讨论】:

  • +1 因为您的答案在技术上是正确的,但实际上我错过了诸如“IsTextAvailable”方法之类的东西(请参阅问题的 cmets)。
【解决方案3】:

如果要检查当前节点是 CDATA 节点还是 TEXT 节点,只需使用 Delphi is 运算符。还有一些类似nodeType 的属性,你仍然在使用:-)

? XML CDATA read 

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多