Исключение файла не найден при попытке проверить xml на файл xsd

Я продолжаю получать исключение 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>

Кто-нибудь знает, почему у меня возникает эта проблема?

Что возвращают new File(xmlPath).exists() и new File(xsdPath).exists()? (Также была бы полезна полная трассировка стека.) Если один из вышеперечисленных возвращает false, значит, у вас есть проблема - в этом случае распечатайте getAbsolutePath() соответствующего файла и проверьте разницу между этим и тем, что вы ожидаете.

Michael Berry 02.05.2018 15:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
327
1

Ответы 1

Вы не сообщаете конструктору 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());
                ...
    }}

Другие вопросы по теме