2016-09-21 2 views
2

Я пытаюсь проверить документ 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. 

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

Что я пропустил?

+1

Ваш XSD говорит, что ваш элемент «книга» содержит список элементов «главы». Вы пытались добавить другой элемент. Я не уверен, в чем вы сомневаетесь. Вы хотите узнать, как переписать 'main.xsd', чтобы разрешить playmusic? –

+0

Я думал, что можно будет проверить документ без перезаписи 'main.xsd'. Оба XSD на самом деле не связаны. Я предполагаю, что я мог бы написать XSD, который объединяет оба XSD, но это было бы неприятно, так как у моего реального приложения могло быть несколько расширений XSD, которые могут присутствовать или нет, и список может быть продолжен. (Подумайте об этом как о встроенных поддокументах для своего рода плагина). Мой вопрос в том, есть ли способ проверить это, так что валидатор не будет жаловаться на элементы из extension.xsd – taranion

ответ

1

Ваш main.xsd является явным в разрешении в элементе book. Если вы хотите разрешить любой дополнительный элемент, вам нужно указать, что в main.xsd. После этого вы можете добавить любые расширения XSD, которые вы хотите. см. https://www.w3.org/TR/xmlschema-0/#any.

новый 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:any minOccurs="0" maxOccurs="unbounded" /> 
     <xs:element maxOccurs="unbounded" ref="chapter"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="chapter"> 
    <xs:complexType/>  
</xs:element> 
</xs:schema> 
+0

Спасибо. Элемент ANY является хорошим компромиссом между тем, чтобы основной XSD не имел понятия о возможных расширениях и все еще действителен, хотя в дереве документов появляются неизвестные (внутри 'main.xsd') элементы. Таким образом, мне просто нужно определить возможные точки расширения в 'main.xsd'. – taranion

Смежные вопросы