2016-10-26 8 views
1

Я хочу создать грамматику, способную проверять как полный XML-документ, так и его фрагмент.Один XSD для всего документа и фрагмента?

У меня есть сводный набор документов в пакете. Каждый документ имеет набор мета-данных:

<batch> 
    <document> 
     <metadata1 /> 
     <metadata2 /> 
     <metadata3 /> 
    </document> 
    <document> 
     <metadata1 /> 
     <metadata2 /> 
     <metadata3 /> 
    </document> 
</batch> 

Мой процесс SpringBatch раскалывает партию в документах (с StaxEventItemReader) Я желаю, чтобы проверить суб XML, представляющий собой единый документ:

<document> 
    <metadata1 /> 
    <metadata2 /> 
    <metadata3 /> 
</document> 

I прочитайте here, что я не могу использовать частичный XSD для проверки XML.

Однако есть способ, , избегая при этом дублирования, для проверки с двумя XSDs, где можно было бы утвердить фрагмент, а другой будет проверять достоверность партии?

ответ

1

Вы можете достичь своей цели с помощью одного XSD, задав несколько возможных корневых элементов:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="batch"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="document" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="document"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="metadata1" type="xs:string" /> 
     <xs:element name="metadata2" type="xs:string" /> 
     <xs:element name="metadata3" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

Таким образом, документы могут иметь либо batch или document корневой элемент а, и нет никакого дублирования определения.

+0

Crystal прозрачный, работа совершенно. Спасибо! Кроме того, это позволяет мне лучше понять [этот пост] (http://stackoverflow.com/questions/1614015/working-with-multiple-xsds) –