Мы используем Delphi 2007 и поставщика oxmldom
Open XML
.
Файл ввода в нормальных ситуациях выглядит примерно так:
<root>
<child>Some Text</child>
</root>
Теперь нам нужно обработать входной файл, который использует тип узла CDATA
:
<root>
<child><![CDATA[Some special Text]]></child>
</root>
Node.IsTextElement
неожиданно возвращает False
, но Node.Text
все еще работает, как и ожидалось.
Я знаю, что IXMLNode.IsTextElement
- это просто удобный метод, но я нахожу это поведение довольно странным.
В качестве обходного пути мы теперь используем этот пользовательский метод:
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;
У меня вопрос: почему IsTextElement
не работает с CDATA
узлами и есть ли более простое решение?