![](/img/trans.png)
[英]Cannot find the declaration of element error for simple schema validation via code
[英]XML Schema Validation : Cannot find the declaration of element (root)
我研究了 XML 並且有一些問題。 它需要一個警告。 我認為它與驗證器有關,因為當我評論模式的路徑時,工廠創建模式和 setSchema() 不會出現警告消息。 那里有我的驗證器代碼:
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有關的問題,但現在我不確定是什么問題:(有問題的output:
[main] ERROR org.example.handler.PlanesErrorHandler - 2 : 9 - cvc-elt.1.a: Cannot find the declaration of element 'planes'.
如果有人向我解釋這個問題,我會很高興。
嘗試添加
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.