Поддержка javax.xml.parsers.DocumentBuilder для сложных типов - PullRequest
0 голосов
/ 13 октября 2010

Я пытаюсь собрать код проверки.Я пытаюсь проверить схему:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:choice="http://example.com/SimpleChoice" targetNamespace="http://example.com/SimpleChoice" ecore:nsPrefix="choice" ecore:package="com.example.simple.choice">
    <xsd:complexType name="Plane">
        <xsd:sequence>
            <xsd:element name="freightDetails" type="xsd:string" minOccurs="0"/>
            <xsd:element name="passengers" type="xsd:int" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

С помощью следующего XML:

<?xml version="1.0" encoding="UTF-8"?>
<choice:Plane xmlns:choice="http://example.com/SimpleChoice">
    <freightDetails>Boxes</freightDetails>
</choice:Plane>

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

[Error] :1:100: cvc-elt.1: Cannot find the declaration of element 'choice:Plane'.

Когда он пытается загрузить документ со следующим кодом:

SchemaFactory factory =
    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(schemaFile);

DocumentBuilderFactory parserFactory = DocumentBuilderFactory.newInstance();
parserFactory.setSchema(schema);
parserFactory.setNamespaceAware(true);
DocumentBuilder parser = parserFactory.newDocumentBuilder();

Document document = parser.parse(inputSource);

Validator validator = schema.newValidator();
validator.validate(new DOMSource(document));

Сбой при достижении:

Document document = parser.parse(inputSource);

У кого-нибудь есть идеи о том, как я смогу заставить это работать?(Или валидатор, который поддерживает такое поведение?)

Спасибо

Роб

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Это потому, что ваша схема определила тип (Plane), но не определила никаких разрешенных элементов, которые используют этот тип.Сам по себе тип не имеет значения вне самой схемы.

Вам необходимо добавить <xsd:element> в свою схему.Самое простое решение - использовать в нем анонимный сложный тип, например:

<xsd:element name="Plane">
  <xsd:complexType>
    <xsd:sequence>
        <xsd:element name="freightDetails" type="xsd:string" minOccurs="0"/>
        <xsd:element name="passengers" type="xsd:int" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>    
</xsd:element>
0 голосов
/ 13 октября 2010

В примере схемы вы определили только тип с именем Plane, а не элемент с именем Plane.Добавьте объявление элемента в свою схему и посмотрите, что произойдет ...

...