【问题标题】:How can I get the Open XML DOM parser to parse an ntEntityRef node?如何让 Open XML DOM 解析器解析 ntEntityRef 节点?
【发布时间】:2012-06-07 10:35:41
【问题描述】:

我有这个 XML 输入:

<?xml version="1.0" encoding="utf-8"?>
<string>
&lt;N/A&gt;
</string>

这里有一个简短的代码示例来说明问题:

uses
  xmldom, oxmldom, XMLDoc, XMLIntf;

procedure TForm1.Test;
var
  Document     : IXMLDocument;
  StringNode   : IXMLNode;
  LessThanNode : IXMLNode;
begin
  DefaultDOMVendor := 'Open XML';
  Document         := LoadXMLData(Memo1.Lines.Text);
  StringNode       := Document.DocumentElement;
  LessThanNode     := StringNode.ChildNodes.First;
  ShowMessage(LessThanNode.Text); // Displays '' (an emtpy string)
  ShowMessage(LessThanNode.XML);  // Displays '&lt;'
  ShowMessage(StringNode.Text);   // Causes an EXMLDocError, because the string node contains more than just a single node with NodeType = ntText
end;

如何让Open XML 解析器将&amp;lt;&amp;gt 和类似的XML 实体转换为它们的真实文本(如&lt;&gt;)?

我可以为 XML 规范中的预定义实体编写一个解决方法: http://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent

虽然这对额外的实体节点没有帮​​助......

相关:Why doesn't IXMLNode.IsTextElement return True for CDATA elements?

【问题讨论】:

  • 您是否尝试过使用 OpenXML 验证文档?
  • @Pol - 他为什么要这么做?

标签: xml delphi delphi-2007


【解决方案1】:

在您的情况下,我认为 InnerText 属性应该可以工作。

ShowMessage(Document.DocumentElement.InnerText);

编辑: InnerText 属性不是 IXMLNode 接口的一部分(我认为 MSXML 有它。)OpenXML 实现 (ADOM) 有一个 GetTextContent 方法,它可能会同样的事情,所以你可能想研究一下。

【讨论】:

  • IXMLNode 中没有 InnerText(至少在 D2007 中)。除非我在这里遗漏了什么?
【解决方案2】:

较新版本的 Delphi 不再提供 oxmldom 单元,并且可以使用较新版本的所谓 ADOM:

http://www.philo.de/xml/downloads.shtml

因此,使用不同的解析器或升级 OpenXML 都可以解决问题。

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多