2012-06-07 142 views
0

我有这样的XML输入:如何获取Open XML DOM解析器来解析ntEntityRef节点?

<?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?

+0

您是否尝试过使用OpenXML验证文档? – Pol

+0

@Pol - 他为什么要这么做? –

回答

0

德尔福的较新版本不会再出货oxmldom单元和所谓的ADOM的新版本可用:

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

因此,无论使用不同的解析器或升级OpenXML的解决了这个问题。

1

在你案例我认为InnerText财产应该工作。

ShowMessage(Document.DocumentElement.InnerText); 

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

+1

“IXMLNode”中没有'InnerText'(至少在D2007中)。除非我在这里错过了什么? –