Я наконец-то понял это.
Прежде всего, в схеме foo элементы bar-config и baz-config имеют тип, который включает в себя элемент any
, например:
<sequence>
<any minOccurs="0" maxOccurs="1"
processContents="lax" namespace="##any" />
</sequence>
Затем в xml необходимо указать правильное пространство имен, используя атрибут xmlns
дочернего элемента bar-config или baz-config, например:
<bar-config>
<config xmlns="http://www.example.org/bar/Alpha">
... config xml here ...
</config>
</bar-config>
Тогдаваш файл XML-схемы для панели Alpha будет иметь целевое пространство имен http://www.example.org/bar/Alpha и определит корневой элемент config
.
Если в вашем XML-файле есть объявления пространства имен и расположения схем для обоихфайлов схемы, этого достаточно для того, чтобы редактор выполнил всю проверку (по крайней мере, достаточно хорошо для Eclipse).
Пока что мы выполнили требование, чтобы автор xml мог написать xml таким образомчто он проверен в редакторе.
Теперь нам нужно, чтобы потребитель мог проверить.В моем случае я использую Java.
Если по какой-то случайности вы знаете файлы схемы, которые вам нужно будет использовать для предварительной проверки, то вы просто создаете один объект Schema и проверяете как обычновот так:
Schema schema = factory().newSchema(new Source[] {
new StreamSource(stream("foo.xsd")),
new StreamSource(stream("Alpha.xsd")),
new StreamSource(stream("Mercury.xsd")),
});
В этом случае, однако, мы не знаем, какие файлы xsd использовать, пока не проанализируем основной документ.Итак, общая процедура такова:
- Проверка xml с использованием только основной (foo) схемы
- Определение схемы, используемой для проверки части документа
- Найдите узел, который является корнем части для проверки, используя отдельную схему
- Импортируйте этот узел в новый документ
- Проверьте новый документ, используя другой файл схемы
Предостережение: похоже, что документ должен быть построен с учетом пространства имен, чтобы это работало.
Вот некоторый код (он был разорван из разных местмой код, поэтому при копировании и вставке могут возникать ошибки:
// Contains the filename of the xml file
String filename;
// Load the xml data using a namespace-aware builder (the method
// 'stream' simply opens an input stream on a file)
Document document;
DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
document = docBuilderFactory.newDocumentBuilder().parse(stream(filename));
// Create the schema factory
SchemaFactory sFactory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
// Load the main schema
Schema schema = sFactory.newSchema(
new StreamSource(stream("foo.xsd")));
// Validate using main schema
schema.newValidator().validate(new DOMSource(document));
// Get the node that is the root for the portion you want to validate
// using another schema
Node node= getSpecialNode(document);
// Build a Document from that node
Document subDocument = docBuilderFactory.newDocumentBuilder().newDocument();
subDocument.appendChild(subDocument.importNode(node, true));
// Determine the schema to use using your own logic
Schema subSchema = parseAndDetermineSchema(document);
// Validate using other schema
subSchema.newValidator().validate(new DOMSource(subDocument));