Использование dom4j DOMDocument для подачи validator.validate (DOMSource) не работает в java 1.6 (xsi: noNamespaceSchemaLocation не допускается), работает в 1.5

Использование dom4j DOMDocument для подачи validator.validate (DOMSource) не работает в java 1.6 (с xsi: noNamespaceSchemaLocation не может отображаться в корневом элементе), работает в 1.5

Я нахожу следующую проблему довольно трудноразрешимой (хорошо, это мягко сказано) - любые идеи будут оценены. В настоящее время кажется, что лучше всего отказаться от dom4j в пользу, например, XOM (http://stackoverflow.com/questions/831865/what-java-xml-library-do-you-recommend-to-replace-dom4j).

Я проверял XML в памяти, созданный из dom4j 'new DOMDocument ()', но это не будет работать с Java 6.

Следующий вызов для проверки (источника) DOMDocument, производного от dom4j (1.6.1), работает с Java 1.5.x, но не работает с Java 1.6.x:

public void validate() throws Exception {
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    schemaFactory.setErrorHandler(null);
    Schema schemaXSD = schemaFactory.newSchema(new URL(getSchemaURLString()));
    Validator validator = schemaXSD.newValidator();
    DOMSource source = new DOMSource(getDocument());
    validator.validate(source);
}

getSchemaURLString () также используется для добавления атрибута xsi: noNamespaceSchemaLocation к корневому узлу, т. е .: xsi: noNamespaceSchemaLocation = "http: // localhost: 8080 / integration / xsd / fqlResponseSchema-2.0.xsd"

Следующее исключение:

Exception:  org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.;                
complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3182)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processAttributes(XMLSchemaValidator.java:2659)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2066)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:273)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:240)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:186)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:104)
at javax.xml.validation.Validator.validate(Validator.java:127)

Вот начало XML, созданного после отключения вызова validator.validate (source):

<?xml version="1.0" encoding="utf-8"?> 
<meetings xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
.............
</meetings>

И XSD:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="meetings">
    <xs:complexType>
      <xs:choice>
    <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" ref="summary" />
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="meeting" />
        </xs:sequence>
        <xs:element ref="error" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="summary">
................

Итак, мой корневой элемент отклоняется, потому что он содержит атрибут xsi: noNamespaceSchemaLocation. И в самой схеме это не указано как допустимый атрибут моего корневого элемента?

На данный момент мне кажется, что мне нужно отказаться от dom4j для этой задачи и переключиться на одно из других решений, например, как описано здесь:

Но в любом случае хотелось бы знать, что я сделал не так!

Заранее спасибо.


person user598656    schedule 22.02.2011    source источник
comment
Об ошибке сообщается в специальных полях, но вы показываете собрания как корневой элемент (и не показываете специальные поля). Одна из возможностей заключается в том, что в специальных полях префикс xsi разрешается не в http://www.w3.org/2001/XMLSchema-instance.   -  person Kevin    schedule 12.10.2011


Ответы (2)


У меня была такая же проблема, и я нашел следующую документацию на

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html

Проверить по схеме, указанной в документе

В некоторых документах указывается схема, по которой они ожидают проверки, обычно с использованием атрибутов xsi: noNamespaceSchemaLocation и / или xsi: schemaLocation, например:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">  
 ...

Если вы создаете схему без указания URL-адреса, файла или источника, то язык Java создает схему, которая просматривает проверяемый документ, чтобы найти схему, которую он должен использовать. Например:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
Schema schema = factory.newSchema();

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

person Jako    schedule 30.07.2012

Причина, по-видимому, в том, что создается и используется JAXP SAXParser без учета пространства имен (см. Ссылка).

И решение для разных библиотек я нашел на www.edankert.com.

person Arthur    schedule 08.01.2013