Я продолжаю получать исключение File Not Found, когда пытаюсь запустить следующий код:
public static boolean validateXMLSchema(String xsdPath, String xmlPath){
try{
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File(xsdPath));
javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File(xmlPath)));
return true;
}
catch (Exception e){
System.out.println(e);
return false;
}
}
Вот как я называю свой метод:
Boolean value = validateXMLSchema("shiporder.xsd",xmlfile);
shiporder - это имя файла, который компилятор ищет в папке проекта.
Переменная xmlfile - это строка, содержащая файл xml, который будет сравниваться с файлом xds.
Я получаю исключение "файл не найден", хотя я проверил правильность расположения файла.
Это мой xml-файл:
<?xml version = "1.0" encoding = "UTF-8"?>
<shiporder orderid = "889923"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation = "shiporder.xsd">
<orderperson>John Smith</orderperson>
<shipto>
<name>Ola Nordmann</name>
<address>Langgt 23</address>
<city>4000 Stavanger</city>
<country>Norway</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
Это файл xsd:
<?xml version = "1.0" encoding = "UTF-8" ?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<xs:element name = "shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name = "orderperson" type = "xs:string"/>
<xs:element name = "shipto">
<xs:complexType>
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "address" type = "xs:string"/>
<xs:element name = "city" type = "xs:string"/>
<xs:element name = "country" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name = "item" maxOccurs = "unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name = "title" type = "xs:string"/>
<xs:element name = "note" type = "xs:string" minOccurs = "0"/>
<xs:element name = "quantity" type = "xs:positiveInteger"/>
<xs:element name = "price" type = "xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name = "orderid" type = "xs:string" use = "required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Кто-нибудь знает, почему у меня возникает эта проблема?
Вы не сообщаете конструктору File (), где находится файл. Этот конструктор преобразует имя файла в абстрактный путь и преобразует результат в системно-зависимый каталог по умолчанию. Вероятно, это не то, что вам нужно.
Если xsd находится где-то в вашем проекте, используйте yourProject.YourReader.class.getResource(xsdPath)
. xsdPath будет «относительным» именем ресурса, которое обрабатывается относительно пакета класса. В качестве альтернативы вы можете указать «абсолютное» имя ресурса, используя начальную косую черту. Например, если ваш xsd находится в том же каталоге, что и его устройство чтения, используйте getResource("shiporder.xsd")
. Если вы собираетесь из корня проекта, используйте getResource("/path/to/shiporder.xsd")
.
Затем вы можете превратить этот ресурс в файл, если вам нужно, используя new File(resource.toURI())
.
Для вашего кода:
public static boolean validateXMLSchema(String xsdPath, String xmlPath){
try{
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File(ThisClass.class.getResource("/path/to/shiporder.xsd").toURI());
...
}}
Что возвращают
new File(xmlPath).exists()
иnew File(xsdPath).exists()
? (Также была бы полезна полная трассировка стека.) Если один из вышеперечисленных возвращаетfalse
, значит, у вас есть проблема - в этом случае распечатайтеgetAbsolutePath()
соответствующего файла и проверьте разницу между этим и тем, что вы ожидаете.