Как я могу найти все элементы в схеме XML, чье значение указано как QName? - PullRequest
0 голосов
/ 19 марта 2012

Предположим, что ...

  • У меня сложная XML-схема, которая импортирует / включает другие файлы схемы, которые, в свою очередь, импортируют / включают в себя еще больше файлов схемы.
  • Я хочу найти все элементы в этой XML-схеме, которые имеют значение (т. Е. Текстовый узел), который объявлен как тип QName.
  • Я хочу, чтобы местоположение (путь) этих элементов было выражено в виде операторов XPath (например, /foo/bar).

Если я пишу приложение на Java, какая технология подходит для этой работы? Это объектная модель схемы, подобная XSOM ? Это Java XPath API ? Что-то еще?

Редактировать : Для тех, кто хочет получить краткий старт при доступе к SCM в Саксонии (согласно рекомендации Майкла Кея ниже), вот некоторый код Java (обработка исключений без):

// Load the XSD into Saxon
Processor processor = new Processor(true);
SchemaManager schemaManager = processor.getSchemaManager(); 
DocumentBuilder documentBuilder = processor.newDocumentBuilder();
SAXSource saxSource = new SAXSource(new InputSource("path/to/yourSchema.xsd"));
XdmNode schema = documentBuilder.build(saxSource);
schemaManager.load(saxSource);
// Export the SCM
XdmDestination destination = new XdmDestination();
schemaManager.exportComponents(destination);
XdmNode xdmNode = destination.getXdmNode();
System.out.println(xdmNode.toString());

1 Ответ

0 голосов
/ 19 марта 2012

Запрашивать документы схемы сложно, так как в XSD существует множество способов сказать одно и то же: например, именованные группы моделей и группы атрибутов значительно усложняют вашу задачу.

Если вы ищете типы, производные как от QName, так и от самого QName, то это действительно довольно сложно.

Таким образом, сделать это с какой-то «скомпилированной» схемой намного проще, чем с необработанными документами схемы.

Использование XSOM является одним из подходов, хотя он не имеет возможности запроса IIRC. Другой подход состоит в том, чтобы использовать вывод Saxon SCM: это представление скомпилированной «модели компонентов схемы» в форме XML; Будучи скомпилированной схемой, вам не нужно беспокоиться обо всех сложностях xs: include, xs: redefine и т. д., в то время как XML означает, что вы можете использовать XQuery на нем. (Я бы порекомендовал XQuery, а не XPath, потому что там будет много объединений, включая рекурсивные объединения, для которых вам нужны пользовательские функции.)

...