Синтаксический анализ 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, похоже, не распознает этого функция и не заменяет текст. Есть идеи, как решить эту проблему?

726   4  

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

    Ничего не найдено.