Разбор XML-ссылок в Delphi - PullRequest
       11

Разбор XML-ссылок в Delphi

3 голосов
/ 11 сентября 2009

Я использовал мастер связывания данных 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 ]

2 голосов
/ 12 сентября 2009

Internet Explorer наверняка использует библиотеку MSXML. Установите для свойства TXmlDocument.DomVendor значение MSXML_DOM (находится в блоке msxmldom), и вы должны получить то же поведение. Вы также можете изменить глобальную переменную DefaultDOMVendor на SMSXML, чтобы все новые TXmlDocument объекты использовали этого поставщика.

1 голос
/ 09 октября 2009

Следующее решило проблему для меня. Кажется, что парсер 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, для работы с внешними объектами.

1 голос
/ 25 сентября 2009

Internet Explorer использует XmlResolver . Свойство XmlResolver XmlDocument используется классом XmlDocument для поиска ресурсов, которые не являются встроенными в данных XML, таких как определения типов внешних документов (DTD), объекты, и схемы. Эти элементы могут находиться в сети или на локальном диске и могут быть идентифицированы с помощью универсального идентификатора ресурса (URI). Это позволяет XmlDocument разрешать узлы EntityReference, присутствующие в документе, и проверять документ в соответствии с внешним DTD или схемой.

вам следует использовать библиотеку delphi, которая реализует преобразователь и анализатор для внешних ресурсов.

Открытый XML реализует преобразователь с использованием TStandardResourceResolver

Bye.

1 голос
/ 13 сентября 2009

Вы уже пробовали OmniXML ? Я использую его годами, и это всегда решало мои проблемы с файлами XML. Если нет, я бы посоветовал вам попробовать: он прост в использовании, легок и бесплатен.

...