2013-08-22 4 views
1

Я получаю сообщение об ошибке при использовании JDOMОшибка при работе SAXBuilder с параметром XMLReaders.XSDVALIDATING

org.jdom2.input.JDOMParseException: Ошибка в строке 4: CVC-elt.1: не может найти декларацию элемент 'rootElement'.

У меня есть XSD menu.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema version="1.0" 
      targetNamespace="http://www.w3schools.com/menu" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      xmlns="http://www.w3schools.com/menu" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="rootElement" type="xs:string"/> 
</xs:schema> 

и XML menu.xml

<?xml version="1.0"?> 
<rootElement xmlns="http://www.w3schools.com/menu" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.w3schools.com/menu menu.xsd"> 
</rootElement> 

использованием

public class RunXml 
{ 
    public static void main(String[] args) throws JDOMException, IOException 
    { 
     SAXBuilder builder = new SAXBuilder(XMLReaders.XSDVALIDATING); 
     File xml = new File("xml/menu.xml"); 
     InputStream inputStream = new FileInputStream(xml); 
     Document document = builder.build(inputStream); 
    } 
} 

Файлы находятся рядом. В чем проблема?

+0

Не могли бы вы отправить свой код java чуть больше? –

+0

Pandiyan Cool. добавлено –

ответ

1

Не удалось найти xsd. Проблема решена так:

File xsdfile = new File("xml/menu.xsd"); 
XMLReaderJDOMFactory schemafac = new XMLReaderXSDFactory(xsdfile); 
SAXBuilder builder = new SAXBuilder(schemafac); 
-1
<rootElement xmlns="http://www.w3schools.com/menu" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.w3schools.com/menu menu.xsd"> 
</rootElement> 

На этом месте в XML

<rootElement xmlns="http://www.w3schools.com/menu" 

В XSD

targetNamespace="http://www.w3schools.com/menu" 

Установить действительный URI

+0

Зачем писать допустимое пространство имен? Необходимо определить уникальность имен –

1

Часть вашей проблемы является «обфускация» у вас есть к источнику ввода для метода сборки() JDOM. Вы делаете то, что кажется распространенной плохой практикой перевода значений файла в InputStreams, прежде чем отправлять их методу build(). На самом деле вам даже не нужно переводить строковое значение "xml/menu.xml" в объект File. Вобще:

SAXBuilder builder = new SAXBuilder(XMLReaders.XSDVALIDATING); 
Document document = builder.build("xml/menu.xml"); 

Значение Строки "xml/menu.xml" представляет собой идентификатор системы, и SAX парсер будет интерпретировать это, по умолчанию, как имеющие SYSTEMID как нечто вроде file://./xml/menu.xml. Затем, когда он ищет схему menu.xsd, он будет искать ее относительно этого URI и найдет файл: //./xml/menu.xsd

Когда вы даете метод сборки экземпляр InputStream, там не является идентификатором системы, прикрепленным к InputSource, и, следовательно, нигде он не может найти файл menu.xsd.

Вы должны использовать только методы InputStream и Reader метода build (...), когда нет другого выбора, и если вы используете do, используйте эти методы, вы должны попытаться использовать версии, в которых вы можете также введите системный идентификатор.

Я должен обновить документацию для этих методов, чтобы избежать этой проблемы.

+0

в моем проекте более сложно, это простой пример. проект Мне нужно работать InputStreams –

+0

Это может быть так, и в этом случае, используя метод, который у вас есть в вашем собственном ответе, будет работать нормально.Это также будет более эффективно, если вы обрабатываете несколько файлов для одной и той же схемы, и вы создаете экземпляр только одного экземпляра «schemafac» XMLReaderXSDFactory – rolfl

+0

Спасибо за ваш ответ. Я понял, почему не работает –

Смежные вопросы