我有这个XML输入:
<?xml version="1.0" encoding="utf-8"?>
<string>
<N/A>
</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 '<'
ShowMessage(StringNode.Text); // Causes an EXMLDocError, because the string node contains more than just a single node with NodeType = ntText
end;
如何让Open XML
解析器将<
,>
和类似的XML实体转换为真实文本(例如<
和>
) ?
我可以为XML规范中的预定义实体编写一个解决方法: http://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent
虽然这对其他实体节点没有帮助......
相关:Why doesn't IXMLNode.IsTextElement return True for CDATA elements?
答案 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可以解决问题。