Проверьте, соответствует ли XML предоставленному пользователем предикату - PullRequest
0 голосов
/ 02 февраля 2011

Из Объявление пространств имен в выражении XPath

Упрощенная задача:

  • Существует множество файлов XML различной структуры с пространствами имен
  • Пользователь определяет несколько выражений в текстовой форме
  • Выражения применяются к каждому XML-файлу, дающему результат: да или нет

Для какой технологии следует использовать дляэта задача в .NET 3.5 без использования сторонних библиотек ?

Кандидаты:

  • XPath. Не является предпочтительным случаем, поскольку не существует простого способа указать пространства имен в выражении XPath .
  • ...

Обновление:

Я понял, что на самом деле вопрос в следующем: Есть ли способ, кроме XPath?

Schematron - единственное предложение на данный момент.

Ответы [ 3 ]

1 голос
/ 02 февраля 2011

Ограничение «без использования сторонних библиотек» кажется странным: большинство людей в наши дни пытаются максимизировать повторное использование кода.

Без этих ограничений я бы сказал, что Schematron - это ответ. Он делает именно то, что вы ищете.

Также можно добиться того же эффекта, используя таблицу стилей XSLT для определения правил проверки, но в итоге вы заново изобретаете Schematron.

1 голос
/ 02 февраля 2011

Упрощенная задача:

• Существует множество файлов XML различной структуры с пространствами имен

• Пользователь определяет несколько предикатов в текстовой форме

•Предикаты применяются к каждому XML-файлу, дающему результат: да или нет

Не ясно, что слово «предикаты» должно означать в приведенном выше описании.

Я предполагаю, что это означает: " Выражения XPath, которые оцениваются как логические "

Если это так, каждое такое отдельное выражение может быть оценено с использованием, например, XPathNavigator.Evaluate (XPathExpression)

Проблема разных пользователей, использующих разные пространства имен, требует централизованного решения.Один из подходов, который я рекомендую, заключается в создании и публикации центрального каталога префикса пространства имен для сопоставлений пространства имен, чтобы авторы выражений использовали только префиксы из этого каталога.Все эти префиксы будут связаны с соответствующими пространствами имен перед оценкой любого выражения XPath..NET класс XmlNamespaceManager очень подходит для этой цели.Пример использования XmlNamespaceManager вместе с XpathNavigator.Evaluate() и XPathNavigator.Select() можно найти здесь .

Очень важно : Никогда не оценивайте строки, содержащие выражение XPath - это может привести к XPath-инъекции ,Всегда компилируйте строку (например, используя XPathExpression.Compile ()).Даже при соблюдении такой дисциплины оценка предоставленного пользователем выражения XPath может привести к угрозам безопасности.

0 голосов
/ 02 февраля 2011

Если пространства имен являются «проблемой», вы всегда можете:

  1. Предварительная обработка файлов XML с использованием модифицированного преобразования идентификаторов для создания файла XML с узлами, которые не связаны с конкретным пространством имен
  2. Затем оцените предоставленный пользователем XPATH с измененным XML
  3. Вернуть результат

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

...