powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проверка XML на валидность(XSD).
8 сообщений из 8, страница 1 из 1
Проверка XML на валидность(XSD).
    #38500727
f6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f6
Гость
Здравствуйте.
Интересует вопрос, как проверить 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
Проверка XML на валидность(XSD).
    #38500734
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f6,

Приложите содержимое файла file.xml
...
Рейтинг: 0 / 0
Проверка XML на валидность(XSD).
    #38500736
f6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f6
Гость
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
Проверка XML на валидность(XSD).
    #38500739
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проверка XML на валидность(XSD).
    #38500741
f6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f6
Гость
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
Проверка XML на валидность(XSD).
    #38500745
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f6Но мне кажется это костыль, и должны быть какие-то стандартные адекватные действия Создайте отдельный класс, который будет заниматься проверкой на валидность/сопоставлением
схем и пр. действиями, связанные с XML-документами. Все в рамках ООП.
Не создавая классы типа: MyErrorHandler, ContentHandler и пр.
...
Рейтинг: 0 / 0
Проверка XML на валидность(XSD).
    #38500746
Фотография 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
Проверка XML на валидность(XSD).
    #38501139
f6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
f6
Гость
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
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Проверка XML на валидность(XSD).
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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