Синтаксический анализ XML-ссылок в Delphi
Я использовал мастер привязки данных Delphi 2006 для создания интерфейса для файла конфигурации XML. Позже я понял, что некоторые повторяющиеся части XML можно отделить от основного файла и ссылаться там, где это необходимо. Результирующий XML выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY Schema65 SYSTEM "schemas/65.xml">
]>
<module>
<schema>&Schema65;</schema>
</module>
Если я открою этот файл с помощью Internet Explorer, содержимое заполнителя "& Schema65; " будет правильно заменено содержимым внешнего файла. Однако синтаксический анализатор Delphi, похоже, не распознает этого функция и не заменяет текст. Есть идеи, как решить эту проблему?
4 ответов:
Internet Explorer, несомненно, использует библиотеку MSXML. Задайте свойству
TXmlDocument.DomVendorзначениеMSXML_DOM(найденное в блокеmsxmldom), и вы получите то же самое поведение. Вы также можете изменить глобальную переменнуюDefaultDOMVendorнаSMSXML, чтобы все новые объектыTXmlDocumentиспользовали этого поставщика.
Вы уже пробовали OmniXML ? Я использую его в течение многих лет, и это всегда решало мои проблемы, связанные с XML-файлами. Если вы этого не сделали, я бы посоветовал вам попробовать: он прост в использовании, легкий и бесплатный.
Internet Explorer use XmlResolver, свойство XmlResolver XmlDocument используется классом XmlDocument для поиска ресурсов, не встроенных в XML-данные, таких как определения внешних типов документов (DTD), сущности и схемы. Эти элементы могут быть расположены в сети или на локальном диске и идентифицироваться по единому идентификатору ресурса (URI). Это позволяет XmlDocument разрешить узлы EntityReference, которые присутствуют в документе, и проверить документ в соответствии с внешним DTD или схемой.
Вы должны использовать библиотеку delphi, которая реализует распознаватель и синтаксический анализатор для внешних ресурсов.
Open XML реализует распознаватель с помощью TStandardResourceResolver
Пока.
Следующее решило проблему для меня. Похоже, что Delphi default parser (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 "внутри узла" schema". Этот узел также будет иметь дочерний элемент, который, наконец, содержит простой текст, который я ожидал. Текст может быть доступен следующим образом:
MyXML.documentElement.ChildNodes['schema'].FirstChild.FirstChild.Text;Если внешний файл сущности содержит структуру узлов, то соответствующие узлы будут созданы внутри узла ссылки на сущность. Убедитесь, что TXMLDocument.ParseOptions установлены по крайней мере в [poResolveExternals], чтобы это произошло. Этот подход также позволяет относительно легко адаптировать код, созданный мастером привязки XML-данных для работы с внешними сущностями.
Comments