2015-03-12 8 views
0

У меня есть базовая XML-схема, которую я должен расширить с помощью xs: redefine, а затем добавить некоторые расширения из второй схемы. Когда unmarshalling im получает фатальную ошибку: cvc-complex-type.2.4.d: Неверный контент был найден, начиная с базы элементов: TypeTwo. На данный момент не ожидается никакого дочернего элемента. Даже когда другие синтаксические анализаторы говорят, что XML полностью действителен.java jaxb фатальная ошибка проверки с использованием расширений пространства имен

  • Так у меня есть свои базовые теги в base.xsd под пространством имен "http://www.example.com/base"
  • Мои удлинительные теги в extension.xsd под пространством имен "http://www.example.com/extension"
  • И мой переопределение в redefine.xsd, который импортирует extension.xsd

Так что мои базовые теги

<xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="TypeThree" minOccurs="0" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:complexType name="TypeTwo"> 
</xs:complexType> 
<xs:element name="TypeTwo" type="TypeTwo" /> 

<xs:group name="TypeThreeExtension"> 
    <xs:sequence /> 
</xs:group> 

<xs:complexType name="TypeThree"> 
    <xs:sequence> 
     <xs:group maxOccurs="unbounded" minOccurs="0" ref="TypeThreeExtension" /> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="TypeThree" type="TypeThree" /> 

Просто корень, и два элемента, один с группой для расширения.

Мои удлинительные теги:

<xs:schema targetNamespace="http://www.example.com/extension" 
     elementFormDefault="qualified" 
     xmlns="http://www.example.com/extension" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:base="http://www.example.com/base" 
     xmlns:ext="http://www.example.com/extension" 
    > 

<xs:import schemaLocation="base.xsd" namespace="http://www.example.com/base"/> 

<xs:complexType name="ExtTypeOne"> 
    <xs:sequence> 
     <xs:element ref="base:TypeTwo" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="ExtTypeOne" type="ExtTypeOne" /> 

Так только один дополнительный тип, который содержит одну из базовых типов (это, кажется, важным фактором).

redefine.xsd является

<xs:schema targetNamespace="http://www.example.com/base" 
elementFormDefault="qualified" xmlns="http://www.example.com/base" 
xmlns:ext="http://www.example.com/extension" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:import schemaLocation="extension.xsd" namespace="http://www.example.com/extension" /> 

<xs:redefine schemaLocation="base.xsd"> 
    <xs:group name="TypeThreeExtension"> 
     <xs:sequence> 
      <xs:element ref="ext:ExtTypeOne" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:group> 
</xs:redefine> 

Так вот им просто расширить группу базы TypeThreeExtension, так что теперь я могу добавить ExtTypeOne тег ниже. В основном это позволяет структура тегов:

  • Base
    • Расширение
      • Base

Когда я загружаю следующий XML для демаршаллизации ...

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root 
xmlns="http://www.example.com/base" 
xmlns:base="http://www.example.com/base" 
xmlns:ext="http://www.example.com/extension"> 
    <TypeThree> 
     <ext:ExtTypeOne> 
      <base:TypeTwo/> 
     </ext:ExtTypeOne> 
    </TypeThree> 
</Root> 

я получаю следующее сообщение об ошибке:

ValidationEvent 1 - линия: 8, уровень опасности: 2, CVC-комплекс-type.2.4.d: Invalid контент был обнаружен, начиная с элемента 'основания: TypeTwo. На данный момент не ожидается никакого дочернего элемента.

Независимо от того, что я делаю, я не могу избавиться от этой ошибки.На самом деле - даже когда я вставляю объекты в XML, JAXB фактически создает XML, который он тогда (по unmarshalling) отчетам недействителен. Это ошибка JAXB?

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

Это убивает меня ...

ответ

0

Недавно я понял, что здесь происходит. Объект Schema, который я использовал в unmarshaller, динамически генерировался из объекта JaxbContext. Код выглядел примерно так ...

CONTEXT = JAXBContext.newInstance(Root.class); 
     final Collection<StreamResult> results = new ArrayList<StreamResult>(); 
     CONTEXT.generateSchema(new SchemaOutputResolver() { 
      @Override 
      public Result createOutput(String arg0, String suggestedFileName) throws IOException { 
       System.out.println("create output: "+arg0+" "+suggestedFileName); 
       StreamResult result = new StreamResult(); 
       result.setSystemId(suggestedFileName); 
       results.add(result); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       result.setOutputStream(baos); 
       return result; 
      } 
     }); 
     Collection<StreamSource> sss = new ArrayList<StreamSource>(); 
     for(StreamResult r : results){ 
      ByteArrayOutputStream baos = ((ByteArrayOutputStream)(r.getOutputStream())); 
      StreamSource ss = new StreamSource(new ByteArrayInputStream(baos.toByteArray()),r.getSystemId()); 
      sss.add(ss); 
     } 
     Schema sm = schemaFactory.newSchema(sss.toArray(new StreamSource[]{})); 

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

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(new Source[]{ 
        new StreamSource(new File("./src/main/resources/redefine.xsd")) 
      }); 

Этот новый объект схемы проверяет XML без каких-либо ошибок проверки.

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

  • Нет связанных вопросов^_^