XML Проверка схемы: не удается найти объявление элемента (root) - PullRequest
0 голосов
/ 11 апреля 2020

Я изучаю XML и у меня есть некоторые проблемы. Требуется предупреждение. Я думаю, что это связано с Validator, потому что, когда я комментирую путь к схеме, создаю схему фабрикой и setSchema (), предупреждающее сообщение не появляется. Там мой код Validator:

public class ValidatorSAX {
    public static void validate(){
        String fileName = "src/main/resources/planes.xml";
        //String schemaName = "src/main/resources/planes.xsd";
        Schema schema = null;
        String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
        SchemaFactory factory = SchemaFactory.newInstance(language);
        try{
            //schema = factory.newSchema(new File(schemaName));
            SAXParserFactory spf = SAXParserFactory.newInstance();
            //spf.setSchema(schema);
            SAXParser parser = spf.newSAXParser();
            parser.parse(fileName, new PlanesErrorHandler());
            System.out.println(fileName + " is valid");
        } catch (SAXException e) {
            System.err.println(fileName + " SAX Error " + e.getMessage());
        } catch (ParserConfigurationException e) {
            System.err.println(fileName + " Configuration exception " + e.getMessage());
        } catch (IOException e) {
            System.err.println(" I/O Error" + e.getMessage());
        }

    }
}

и код обработчика:

public class PlanesErrorHandler extends DefaultHandler {
    private static Logger logger = LogManager.getLogger(PlanesErrorHandler.class);
    public PlanesErrorHandler(){ }
    public void warning(SAXParseException e) {
        logger.warn(getLineAddress(e) + "-" + e.getMessage());
    }
    public void error(SAXParseException e) {
        logger.error(getLineAddress(e) + " - " + e.getMessage());
    }
    public void fatalError(SAXParseException e) {
        logger.fatal(getLineAddress(e) + " - " + e.getMessage());
    }
    private String getLineAddress(SAXParseException e) {
        return e.getLineNumber() + " : " + e.getColumnNumber();
    }

Есть код схемы:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="urn:Planes.Namespace"
        xmlns="urn:Planes.Namespace"
        elementFormDefault="qualified">
    <xsd:element name="planes">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Plane"
                         type="Plane"
                         maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:complexType name="Plane">
        <xsd:sequence>
            <xsd:element name="model" type="ModelName"/>
            <xsd:element name="origin" type="xsd:string"/>
            <xsd:element name="chars" type="Chars"/>
            <xsd:element name="parameters" type="Parameters"/>
            <xsd:element name="price" type="xsd:double"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="ModelName">
        <xsd:restriction base="xsd:string"><xsd:pattern value="[A-Z]{2,4}-[1-9]{2,4}"/></xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="Chars">
        <xsd:sequence>
            <xsd:element name="numberOfSeedsForCrew" type="xsd:positiveInteger"/>
            <xsd:element name="characteristics" type="Characteristics"/>
            <xsd:element name="radarAvailability" type="xsd:boolean"/>
        </xsd:sequence>
        <xsd:attribute name="type">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="transport"></xsd:enumeration>
                    <xsd:enumeration value="passengers"></xsd:enumeration>
                    <xsd:enumeration value="freight"></xsd:enumeration>
                    <xsd:enumeration value="fire"></xsd:enumeration>
                    <xsd:enumeration value="agricultural"></xsd:enumeration>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>
    <xsd:complexType name="Characteristics">
        <xsd:sequence>
            <xsd:element name="carryingCapacity" type="xsd:positiveInteger"/>
            <xsd:element name="numberOfPassengers" type="xsd:integer"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="Parameters">
        <xsd:sequence>
            <xsd:element name="length" type="xsd:double"/>
            <xsd:element name="width" type="xsd:double"/>
            <xsd:element name="height" type="xsd:double"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

и xml код :

<?xml version="1.0"?>
<planes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="urn:Planes.Namespace"
        xsi:schemaLocation="urn:Planes.Namespace planes.xsd">
    <Plane>
        <model>AN-225</model>
        <origin>Ukraine</origin>
        <chars type="transport">
            <numberOfSeedsForCrew>6</numberOfSeedsForCrew>
            <characteristics>
                <carryingCapacity>250000</carryingCapacity>
                <numberOfPassengers>70</numberOfPassengers>
            </characteristics>
            <radarAvailability>true</radarAvailability>
        </chars>
        <parameters>
            <length>84.0</length>
            <width>94.8</width>
            <height>18.1</height>
        </parameters>
        <price>300000</price>
    </Plane>
    <Plane>
        <model>AN-148</model>
        <origin>Ukraine</origin>
        <chars type="passengers">
            <numberOfSeedsForCrew>5</numberOfSeedsForCrew>
            <characteristics>
                <carryingCapacity>42000</carryingCapacity>
                <numberOfPassengers>85</numberOfPassengers>
            </characteristics>
            <radarAvailability>true</radarAvailability>
        </chars>
        <parameters>
            <length>29.13</length>
            <width>33.91</width>
            <height>8.19</height>
        </parameters>
        <price>7400</price>
    </Plane>
    <Plane>
        <model>AT-56</model>
        <origin>USA</origin>
        <chars type="agricultural">
            <numberOfSeedsForCrew>1</numberOfSeedsForCrew>
            <characteristics>
                <carryingCapacity>7257</carryingCapacity>
                <numberOfPassengers>0</numberOfPassengers>
            </characteristics>
            <radarAvailability>false</radarAvailability>
        </chars>
        <parameters>
            <length>11.7</length>
            <width>18.68</width>
            <height>3.8</height>
        </parameters>
        <price>893.9</price>
    </Plane>
</planes>

Я не уверен, что программа работает правильно, когда я соединяю эти строки. Раньше я думал, что проблема связана с xsd, но теперь я не уверен, что это такое :( Вывод проблемы:

[main] ERROR org.example.handler.PlanesErrorHandler - 2 : 9 - cvc-elt.1.a: Cannot find the declaration of element 'planes'.

Я буду рад, если кто-нибудь объяснит мне эту проблему.

1 Ответ

0 голосов
/ 11 апреля 2020

Попробуйте добавить

static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...