如何让Open XML DOM解析器解析ntEntityRef节点?

时间:2012-06-07 10:35:41

标签: xml delphi delphi-2007

我有这个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解析器将&lt;&gt和类似的XML实体转换为真实文本(例如<>) ?

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

虽然这对其他实体节点没有帮​​助......

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

2 个答案:

答案 0 :(得分:1)

在您的情况下,我认为InnerText属性应该有用。

ShowMessage(Document.DocumentElement.InnerText);

编辑: InnerText属性不是IXMLNode接口的一部分(我认为MSXML拥有它。)OpenXML实现(ADOM)有一个{{1}可能做同样事情的方法,所以你可能想看看它。

答案 1 :(得分:0)

较新版本的Delphi不再提供oxmldom设备,可以使用更新版本的所谓ADOM:

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

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