2013-06-24 1 views
4

У меня простой XSD и еще более простой XML. Но проверка Java 2 XML не выполняется. (С использованием javax.xml.validation)Что случилось с этим XML/XSD?

Вот мой XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://foo.com/darnit" 
    targetNamespace="http://foo.com/darnit"> 

    <xsd:element name="Person" type="tns:PersonType"/> 

    <xsd:simpleType name="nameType"> 
    <xsd:restriction base="xsd:string"/> 
    </xsd:simpleType> 

    <xsd:complexType name="PersonType"> 
    <xsd:sequence> 
     <xsd:element minOccurs="1" maxOccurs="2" name="FirstName" type="tns:nameType"/> 
     <xsd:element minOccurs="1" maxOccurs="1" name="LastName" type="tns:nameType"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

А вот пример XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Person xmlns="http://foo.com/darnit"> 
    <FirstName>John</FirstName> 
    <FirstName>Michael</FirstName> 
    <LastName>Smith</LastName> 
</Person> 

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

org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'FirstName'. One of '{FirstName}' is expected. 
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source) 
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source) 
at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source) 
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source) 
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source) 
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
at org.apache.xerces.jaxp.validation.StreamValidatorHelper.validate(Unknown Source) 
at org.apache.xerces.jaxp.validation.XMLSchemaValidator.validate(Unknown Source) 
at javax.xml.validation.Validator.validate(Unknown Source) 

Если я квалифицирую XML с префиксом пространства имен, он работает!

<?xml version="1.0" encoding="UTF-8"?> 
<foo:Person xmlns:foo="http://foo.com/darnit"> 
    <FirstName>John</FirstName> 
    <FirstName>Michael</FirstName> 
    <LastName>Smith</LastName> 
</foo:Person> 

Но мой XSD позволяет использовать неквалифицированные элементы!

Должен ли я установить свойство на SchemaFactory, Schema или Validator?

Спасибо.

ответ

2

Добавить elementFormDefault = квалифицирован, чтобы вы schame, например, так:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:tns="http://foo.com/darnit" 
targetNamespace="http://foo.com/darnit" 
elementFormDefault="qualified"> 

Затем все элементы будут находиться в целевом пространстве имен по-умолчанию.

Все объявленные глобально элементы будут принадлежать целевому пространству имен. Однако атрибут «elementFormDefault» управляет владением или не локальными элементами также принадлежат к целевому пространству имен, то есть «являются квалифицированными». Некоторые люди, очевидно, предпочитают «безоговорочный» стиль, который вы непреднамеренно создали. Однако я никогда не видел хороших аргументов в пользу этого.

+0

Unreal! Спасибо, вот и все. Я неправильно понял elementFormDefault = «квалифицированный». Я думал, что это означает, что все элементы должны принадлежать явно объявленному пространству имен. Благодаря! – raminr

+0

@raminr Обновленный ответ для лучшего объяснения. –

+1

Спасибо ... Видел это. Отличное объяснение. Этот материал похож на загадку, которая имеет смысл только после ее решения. :-) – raminr