Я пытаюсь проверить документ XML, который использует несколько пространств имен. Я хочу вставить теги вторичного пространства имен в документ основного пространства имен. Основное/первичное пространство имен не «знает» пространства расширений/вторичных имен.Проверка XML с несколькими пространствами имен в Java
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<book
xmlns ="MyMain_FPI"
xmlns:ns2="MyExtension_FPI"
>
<ns2:playmusic/>
<chapter/>
<chapter/>
</book>
код Java для проверки заключается в следующем:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new Source[] {
new StreamSource(new FileInputStream("main.xsd")),
new StreamSource(new FileInputStream("extension.xsd")),
});
factory.setSchema(schema);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("test.xml"));
Как вы можете видеть, я сразу добавить файлы XSD в DocumentBuilderFactory. Эти файлы:
main.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="chapter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="chapter">
<xs:complexType/>
</xs:element>
</xs:schema>
extension.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyExtension_FPI"
targetNamespace="MyExtension_FPI"
elementFormDefault="qualified">
<xs:element name="playmusic">
</xs:element>
</xs:schema>
Я получаю ошибку при выполнении кода выше
[Error] test.xml:6:18: cvc-complex-type.2.4.a: Ungültiger Content wurde beginnend mit Element 'ns2:playmusic' gefunden. '{"MyMain_FPI":chapter}' wird erwartet.
Значение, которое является неожиданным в основном пространстве имен - это понятно, поскольку сам элемент неизвестен в этом пространстве имен. Я ожидал, что элементы пространства имен расширений будут проигнорированы при повторной проверке документа в главном пространстве имен и наоборот - это означает, что я могу встраивать документы, следующие за пространством имен расширений в основном пространстве имен. Но это, очевидно, не работает.
Что я пропустил?
Ваш XSD говорит, что ваш элемент «книга» содержит список элементов «главы». Вы пытались добавить другой элемент. Я не уверен, в чем вы сомневаетесь. Вы хотите узнать, как переписать 'main.xsd', чтобы разрешить playmusic? –
Я думал, что можно будет проверить документ без перезаписи 'main.xsd'. Оба XSD на самом деле не связаны. Я предполагаю, что я мог бы написать XSD, который объединяет оба XSD, но это было бы неприятно, так как у моего реального приложения могло быть несколько расширений XSD, которые могут присутствовать или нет, и список может быть продолжен. (Подумайте об этом как о встроенных поддокументах для своего рода плагина). Мой вопрос в том, есть ли способ проверить это, так что валидатор не будет жаловаться на элементы из extension.xsd – taranion