0

我有这个 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 实体转换为它们的真实文本(如<and >)?

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

不过,这对额外的实体节点没有帮​​助......

相关:为什么 IXMLNode.IsTextElement 不为 CDATA 元素返回 True?

4

2 回答 2

1

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

ShowMessage(Document.DocumentElement.InnerText);

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

于 2012-06-07T21:19:22.463 回答
0

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

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

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

于 2012-10-25T07:06:46.377 回答