We're using Delphi 2007 and the oxmldom
Open XML
provider.
A normal situations input file looks similar to this:
<root>
<child>Some Text</child>
</root>
Now we have to process an input file that uses the CDATA
node type:
<root>
<child><![CDATA[Some special Text]]></child>
</root>
Node.IsTextElement
suddenly returns False
, but Node.Text
still works as expected.
I know that IXMLNode.IsTextElement
is just a convenience method, but I find this behavior rather odd.
As a workaround we're now using this custom method:
class function TXmlUtils.IsTextOrCDataElement(ANode: IXMLNode): Boolean;
begin
Result := False;
if ANode.ChildNodes.Count = 0 then begin
if ANode.NodeType in [ntText, ntCData] then begin
Result := True;
end;
end else
if ANode.ChildNodes.Count = 1 then begin
if ANode.ChildNodes.First.NodeType in [ntText, ntCData] then begin
Result := True;
end;
end;
end;
My question is: Why does IsTextElement
not work with CDATA
nodes and is there an easier workaround?