Могу ли я проверить выражение XPath по схеме XML? - PullRequest
7 голосов
/ 21 марта 2009

Вы можете проверить выражение XPath по документу XML, чтобы проверить его, но есть ли простой способ проверить то же выражение XPath по схеме для этого документа?

Скажем, у меня есть схема XSD, подобная этой:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc>
  <xsd:element name="RootData">
    <xsd:complexType>
      <xsd:sequence minOccurs="0">
        <xsd:element name="FirstChild">
          <xsd:complexType>
            <xsd:sequence minOccurs="0">
              <xsd:element name="FirstGrandChild">
... etc etc

Существует ли простой или встроенный способ убедиться, что XPath:

/RootData/FirstChild/FirstGrandChild

будет действительным для любых документов XML, которые могут быть основаны на этой схеме? ( Редактировать : Полагаю, я имею в виду потенциально допустимый ; XML-документ фактический может не содержать этих элементов, но XPath все еще может считаться потенциально допустимым для схемы Тогда как, скажем, /RootData/ClearlyInvalidChild/ThisElementDoesntExistEither явно недействителен.)

Конечно, я мог ожидать, что это сработает только с каноническими выражениями XPath, а не с произвольной сложностью, но это нормально.

Я специально думаю о .NET, но мне любопытно, если другие реализации делают это возможным. Не так важно, чтобы я хотел свернуть свой собственный, например, я действительно не хочу писать свой собственный код для преобразования этого выражения XPath в другое, например:

/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc...

... хотя я знаю, что мог бы сделать это, если бы мне действительно пришлось.

Ура!

Ответы [ 2 ]

6 голосов
/ 08 июня 2009

Мы фактически провели исследовательский проект по этому вопросу и внедрили верификатор XPath, примерно в 2000 году. Это было для XPath 1. Я не знаю ни одной доступной в настоящее время библиотеки, которую вы можете использовать для этого.

Если вы хотите реализовать это самостоятельно, вот несколько советов:

  • Вы не сможете преобразовать путь по документу экземпляра в путь по схеме, как вы делали выше. Например, /a//b не преобразуется в /xsd:element[@name='a']//xsd:element[@name='b'], поскольку элемент b может быть определен на верхнем уровне схемы, а не под b.

  • Помните, что, хотя документ XML - это дерево, схема - это график. Если вы ищете пути-потомки, такие как // a, вам нужно будет решить, когда прекратить поиск, или он может продолжаться вечно (например, представьте себе элемент «a», который содержит «b», который содержит «a»)

  • Некоторые пути будут неразрешимыми или, по крайней мере, очень трудными для выбора. Например //*[starts-with(@name, 'foo')]

Если вы все еще готовы, я предлагаю использовать библиотеку, такую ​​как XSD eclipse или классы загрузки схемы .NET, чтобы загрузить схему в память и выполнить проверку в коде.

3 голосов
/ 21 марта 2009

Во время разработки вы могли бы использовать инструмент для генерации образца XML-документа и выполнения вашего XPath для образца. Altova XML Spy имеет такую ​​же функцию, как и SOAP UI.

SOAP UI на самом деле с открытым исходным кодом (Java), так что, возможно, вы можете взглянуть и посмотреть, как он генерирует образцы. В ситуации времени выполнения (т. Е. Если схема и XPath являются входными данными для работающей программы), вам необходимо убедиться, что было сгенерировано достаточное количество необязательных компонентов и примеров данных, чтобы избежать ложных отрицаний, и может потребоваться сгенерировать несколько файлов примеров.

Я бы не стал оценивать XPath по схеме напрямую, поскольку различные Оси сделали бы полное решение очень сложным. Я почти уверен, что это можно сделать, но мне кажется, что это сложная математика. Я предлагаю генерировать образцы как ярлык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...