Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проверка XML на валидность(XSD). / 8 сообщений из 8, страница 1 из 1
14.12.2013, 04:00:48
    #38500727
f6
f6
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
Здравствуйте.
Интересует вопрос, как проверить xml по xsd схеме, и в случае удачной проверки распарсить xml.

Я делаю так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
try {
	SAXParserFactory factory = SAXParserFactory.newInstance();
	factory.setNamespaceAware(true);
	factory.setValidating(true);

	SAXParser parser = factory.newSAXParser();
	parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
	parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:file.xsd");


        //Т.е. сначала я проверяю xml по xsd, ничего не "парся"
	XMLReader reader = parser.getXMLReader();
	MyErrorHandler meh = new MyErrorHandler();
	reader.setErrorHandler(meh);
	reader.parse(new InputSource("file.xml"));

        //А вот тут, !если все валидно/велл-форматно! я бы хотел "парсить" xml (С помощью ContentHandler - startElement, endElement, итд)
        MyContentHandler mch= new MyContentHandler();
	reader.setContentHandler(mch);
	reader.parse(new InputSource("file.xml"));

} catch (ParserConfigurationException e) {
	e.printStackTrace();
} catch (SAXException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}



//Упоминая об ошибках в тексте ниже, я имею ввиду ошибки несоответствия xsd схеме, а не незакрытый тег в xml.

Так вот, как я понял, первый parse() не возвращает никаких сведений о том, валидно все или нет . И даже не выбрасывает исключений. Ошибки обрабатываются в MyErrorHandler или видимо в дефолтном ErrorHandler (выводятся в консоль), если не писать свой.

Если я сразу установлю и ErrorHandler и ContentHandler и выполню parse() - то тем более толку ноль, оно пишет в консоль об ошибках и спокойно парсит файл до конца выполняя логику в ContentHandler .

Есть идея, завести булевскую( true ) переменную в MyErrorHandler , и в каждом методе (warning, error, fatalError) сетать её в false , а затем проверить , и парсить используя ContentHandler только если она true .
Т.е. смысл в том, что если ошибок нет, то и методы не вызовутся, и переменная останется true, и значит можно парсить xml. А если были ошибки, то переменная станет false.

Но мне кажется это костыль, и должны быть какие-то стандартные адекватные действия.
...
Рейтинг: 0 / 0
14.12.2013, 04:31:34
    #38500734
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
f6,

Приложите содержимое файла file.xml
...
Рейтинг: 0 / 0
14.12.2013, 05:14:43
    #38500736
f6
f6
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
Usman,
Так а разница какая? Любой обычный xml.
users.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="UTF-8"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="users.xsd">
	<user id="id0">
		<firstName>asd</firstName>
		<lastName>asd</lastName>
		<email>asdasd@asd.com<;/email>
		<password>asdasd</password>
	</user>
</users>

...
Рейтинг: 0 / 0
14.12.2013, 05:58:07
    #38500739
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
f6,

Скорее всего ошибка в XSD-схеме (либо Ваш XML не соответствует схеме).
Вашему XML:file.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="UTF-8"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file.xsd">
    <user id="id0">
        <firstName>asd</firstName>
        <lastName>asd</lastName>
        <email>asdasd@asd.com<;/email>
        <password>asdasd</password>
    </user>
</users>

должен соответствовать такой XSD:file.xsd
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="users">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="user">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="firstName"/>
              <xs:element type="xs:string" name="lastName"/>
              <xs:element type="xs:string" name="email"/>
              <xs:element type="xs:string" name="password"/>
            </xs:sequence>
            <xs:attribute type="xs:string" name="id"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
...
Рейтинг: 0 / 0
14.12.2013, 06:08:31
    #38500741
f6
f6
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
Usman, с XSD точно все ок. Оно ведь проверяет нормально, если со схемой все ок.
А ошибки появляются если я их специально добавляю.

Ну и собственно обсуждаемый вопрос, как проверку правильно организовать, а не все ли ок с xml/xsd . В том то и смысл проверки, что она должна работать когда что-то не ок с xml/xsd.
XSD
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="users">
		<xs:complexType>
			<xs:sequence>
				<xs:element maxOccurs="unbounded" ref="user" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="user">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="first_name" type="xs:NCName" />
				<xs:element name="last_name" type="xs:NCName" />
				<xs:element name="email" type="Email" />
				<xs:element name="password" type="Password" />
			</xs:sequence>
			<xs:attribute name="id" type="xs:ID" use="required" />
		</xs:complexType>

	</xs:element>
	<xs:simpleType name="Email">
		<xs:restriction base="xs:string">
			<xs:pattern value="паттерн" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Password">
		<xs:restriction base="xs:string">
			<xs:pattern value="паттерн" />
		</xs:restriction>
	</xs:simpleType>
</xs:schema>

...
Рейтинг: 0 / 0
14.12.2013, 07:15:45
    #38500745
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
f6Но мне кажется это костыль, и должны быть какие-то стандартные адекватные действия Создайте отдельный класс, который будет заниматься проверкой на валидность/сопоставлением
схем и пр. действиями, связанные с XML-документами. Все в рамках ООП.
Не создавая классы типа: MyErrorHandler, ContentHandler и пр.
...
Рейтинг: 0 / 0
14.12.2013, 07:20:59
    #38500746
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
Или одной функцией:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static boolean validateXml(File xml, File xsd) {
    try {
        SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
                .newSchema(new StreamSource(xsd))
                .newValidator()
                .validate(new StreamSource(xml));
    } catch (Exception e) {
        return false;
    }
    return true;
}
...
Рейтинг: 0 / 0
15.12.2013, 00:24:55
    #38501139
f6
f6
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка XML на валидность(XSD).
UsmanИли одной функцией:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public static boolean validateXml(File xml, File xsd) {
    try {
        SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
                .newSchema(new StreamSource(xsd))
                .newValidator()
                .validate(new StreamSource(xml));
    } catch (Exception e) {
        return false;
    }
    return true;
}



Это работает, спасибо :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проверка XML на валидность(XSD). / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]