Выбор узлов в схеме XSD с помощью Xpath - PullRequest
1 голос
/ 29 июня 2011

У меня есть следующий код, который я хочу использовать для выбора всех необходимых мне элементов в определенной последовательности. Вот фрагмент:

            XmlDocument schema = new XmlDocument();
            schema.Load(SchemaFileName);
            XmlNamespaceManager xnm = new XmlNamespaceManager(schema.NameTable);
            xnm.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
            XmlNodeList list = schema.SelectNodes(Path);

Однако я не уверен, что я должен написать как путь. В идеале я хочу выбрать все дочерние узлы тега «sequence», но когда я устанавливаю Path в «sequence», это не дает мне ничего, когда я его запускаю. Список узлов просто пуст. То, что я пытаюсь сделать, это получить имена элементов, которые мне понадобятся (по порядку) для проверки XML-файла.

Кроме того, когда я устанавливаю Path как "// @ name", я, тем не менее, получаю что-то, что выбирает все элементы с "name" в качестве атрибута. Те, которые я хочу, специально после тега sequence.

Я также пытался установить путь как «xs: sequence», но это выдает мне ошибку: «Требуется менеджер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или пользовательскую функцию». Что странно, потому что я думал, что уже настроил это ...

Любая помощь приветствуется! Спасибо! Если вам нужна дополнительная информация, я с радостью ее предоставлю.

С уважением,

tf.rz

РЕДАКТИРОВАТЬ: я использую Visual Studio C # 2008. .NET 3.5 SP1

Основная предпосылка связана с другим вопросом, который я разместил относительно переупорядочения столбцов с данными. Но чтобы сократить объяснение. Мне нужно только сказать, что мне просто нужны имена элементов, которые будут проверены схемой xsd (в правильном порядке). У меня есть несколько схем xsd, каждая из которых соответствует одному и тому же «формату» и представляет собой очень и очень статичные файлы. Таким образом, я знаю, что могу смело искать тег последовательности и получать все его дочерние узлы. Хотя Майкл упомянул, что существует множество способов написания схемы, все схемы, с которыми я работаю, похожи и статичны в этом отношении, поэтому, если я смогу это сделать, это будет работать 100% времени. =) * * 1 018

1 Ответ

1 голос
/ 30 июня 2011

Ваша основная проблема заключается в том, что вам необходимо понять, как использовать XPath для доступа к исходному документу, использующему пространства имен.Это довольно элементарный материал, и на этом форуме есть тысячи ответов, которые объясняют это.Вам нужно префиксное имя - xs: sequence - и вы должны сообщить вашему движку XPath, что префикс "xs" представляет URI "http://www.w3.org/2001/XMLSchema" - заклинание для этого меняется от одного движка XPath к другому, и я боюсьне распознайте имена классов в вашем коде, поэтому я не знаю, какой это.

Я думаю, что здесь есть более глубокая проблема. Извлечение информации из исходного XSD-документа с использованием выражений XPath немного похоже напытаться извлечь информацию из программ Java с помощью регулярных выражений. Это будет работать некоторое время, если вы умны, вы можете заставить его работать довольно много времени, но это никогда не будет работать все время, потому что естьслишком много способов написания схемы. Гораздо лучшая идея - обработать схему с использованием реального процессора схемы, а затем использовать его API, чтобы задавать вопросы о содержимом схемы.

...