Следующее решило проблему для меня. Кажется, что парсер Delphi по умолчанию (MSXML) на самом деле включает ссылки на внешние сущности, но каким-то странным образом. Для этого примера
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
<schema>&Schema65;</schema>
</module>
Я предположил, что при создании TXMLDocument и во внешнем файле содержится простой текст, содержимое файла можно получить следующим образом:
MyXML := TXMLDOcument.Create(myfile.xml);
ExternalText := MyXML.documentElement.ChildNodes['schema'].Text;
Это на самом деле работает, если ссылка на сущность заменяется простым текстом. Однако в случае использования внешней сущности Delphi создаст новый дочерний элемент типа «ntEntityRef» внутри узла «схема». У этого узла также будет дочерний элемент, который, наконец, содержит простой текст, который я ожидал. Доступ к тексту может быть таким:
MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text;
В случае, если файл внешнего объекта содержит структуру узла, внутри узла ссылки на объект будут созданы соответствующие узлы. Убедитесь, что для TXMLDocument.ParseOptions установлено значение по крайней мере [poResolveExternals], чтобы это произошло. Этот подход также позволяет относительно легко адаптировать код, сгенерированный мастером привязки данных XML, для работы с внешними объектами.