powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / xml scheme validation используя xerces
20 сообщений из 20, страница 1 из 1
xml scheme validation используя xerces
    #32976136
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например меня есть test.xml и scheme.xsd, как проверить, что файл действительно соответсвует указанной схеме.

Я делаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DocumentBuilderFactory docFactory = DocumentBuilderFactory
	.newInstance();
docFactory.setValidating(true);
		
docBuilder =  new  ThreadLocal();
docBuilder.set(docFactory.newDocumentBuilder());

((DocumentBuilder)docBuilder.get()).parse( new  FileInputStream("test.xml");

Как указать где лежит схема?
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32976153
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц from J2EE Tutorial.
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32976261
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32979490
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что я делаю не так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
String schemaSource="xsd/somexsd.xsd";
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxParser;
		factory.setNamespaceAware(true);
		factory.setValidating(true);
		saxParser = factory.newSAXParser();
		saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); 
		saxParser.setProperty(JAXP_SCHEMA_SOURCE,
			     new  File(schemaSource));
		 try  {
			saxParser.parse(data.getDataStream(),  new  DefaultHandler());
			logger.info("Документ соответствует схеме");
		}  catch  (SAXException e) {
			logger.info("Документ НЕ соответствует схеме");
		} 
этот код всегда считает документ соответствующим схеме :(
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32979510
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе нужно подключить к своему парсеру обработчик ошибок, а то их попросту не видно, для DOM делается так .

Код: plaintext
1.
2.
3.
...
builder.setErrorHandler( new  MyErrorHandler());
...

обработчик ошибок
Код: plaintext
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.
33.
34.
35.
36.
37.
38.
 import  org.xml.sax.ErrorHandler;
 import  org.xml.sax.SAXParseException;

 import  org.apache.log4j.Level;
 import  org.apache.log4j.Logger;
 import  org.apache.log4j.LogManager;

        
 public   class  MyErrorHandler  implements  ErrorHandler{
    
     private  Logger logger = LogManager.getLogger ( this .getClass ());
    
    
    
    /** Creates a new instance of ConnectorErrorHandler */
     public  ConnectorErrorHandler() {
       
    }
    
     public   void  warning(SAXParseException e){
        logger.warn(validator.getError()+"\nWARNING: \n"+e.getMessage());
        logger.error(e);
    }
    
     public   void  error(SAXParseException e){
        logger.error(validator.getError()+"\nVALIDATION ERROR: \n"+e.getMessage());
        logger.error(e);
    }
    
     public   void  fatalError(SAXParseException e){
        System.out.println("FATAL ERROR\n");
        e.printStackTrace(System.out);
        logger.error(validator.getError()+"\nFATAL ERROR: \n"+e.getMessage());
        logger.error(e);
    }
    
    
}
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32980762
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, с этим разобрался... Теперь у меня немного другая задача

У меня есть файл file.xml в котором есть информация о схеме и есть 2 схемы schema1.xsd и schema2.xsd - как указать парсеру только их местоположение

Т.е. если я использую saxParser.setProperty(JAXP_SCHEMA_SOURCE,
new File(schemaSource));
то только на соответсвие этой схеме и будет проверяться документе, мне же нужно использовать схему документа, но где именно лежит сама схема парсер не знает!
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32980779
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сказать по правде, не хрена я не понял вопрося :) Можешь еще раз по подробнее?
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32980802
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как указать парсеру где какая схема лежит (пути к схемам)?
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32980884
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriкак указать парсеру где какая схема лежит (пути к схемам)?

может это:

Declaring the Schemas in the XML Data Set

To declare the schemas to use for the preceding example in the data set, the XML code would look something like this:

<documentRoot
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="employeeDatabase.xsd"
xsi:schemaLocation=
"http://www.irs.gov/ fullpath/w2TaxForm.xsd
http://www.ourcompany.com/ relpath/hiringForm.xsd"
xmlns:tax="http://www.irs.gov/"
xmlns:hiring="http://www.ourcompany.com/"
>
...

The noNamespaceSchemaLocation declaration is something you've seen before, as are the last two entries, which define the namespace prefixes tax and hiring. What's new is the entry in the middle, which defines the locations of the schemas to use for each namespace referenced in the document.

The xsi:schemaLocation declaration consists of entry pairs, where the first entry in each pair is a fully qualified URI that specifies the namespace, and the second entry contains a full path or a relative path to the schema definition. (In general, fully qualified paths are recommended. In that way, only one copy of the schema will tend to exist.)

Note that you cannot use the namespace prefixes when defining the schema locations. The xsi:schemaLocation declaration understands only namespace names and not prefixes.
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32981028
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том та и дело, в моих документах есть имя схемы, но не ее location! Я знаю где эти схемы лежат. Как мне без изменения документов указать парсеру где брать для них схемы?
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32981055
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriв том та и дело, в моих документах есть имя схемы, но не ее location! Я знаю где эти схемы лежат. Как мне без изменения документов указать парсеру где брать для них схемы?

А никак. У меня была такая же задача, я сделал такой файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<?xml version="1.0" encoding="UTF-8"?>

<schemaMappings>
    <mapping>
        <globalSchemaLocation>
           http://namespace1/DataObjects/
         </globalSchemaLocation>

         <localSchemaLocation>
           Здесь путь к схеме1
         </localSchemaLocation>
    </mapping>
    
    <mapping>
        <globalSchemaLocation>
           http://namespace2/DataObjects/
         </globalSchemaLocation>

         <localSchemaLocation>
           Здесь путь к схеме2
         </localSchemaLocation>
    </mapping>
 
</schemaMappings>

Вобщем там мапинг: namespace докмунта и каждому намеспейсу соответсвует своя схема. Ну а реализовать логику, это уже дело техники. Я через JAXP все делал.
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32981294
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понял, а что с этим файлом (<schemaMappings>) дальше делать?
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32981371
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriне понял, а что с этим файлом (<schemaMappings>) дальше делать?
Парсить его надо, это как обычный файл properties.
Я заганял все в Hashmap, globalSchemaLocation это как key, LocalSchemalocation как value. ну и далее, получал namespace (key к Hashmap) xml дукумента и искал в hashmap значение, которое и является путем к схеме.
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32981413
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я и так знаю где лежат схемы! Как это парсеру указать?
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32981488
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriЯ и так знаю где лежат схемы! Как это парсеру указать?
Ну ё моё.... как я понял, у тебя проблема в том, что в исходных XML нету полнлго пути к схеме. Так вот, все пути прописываются в файл (в любом формате, какой тебе удобнее), затем, используя определенный ключ ( в моем случае это namespase, в твоем как я понял это имя схемы) ты из этого файла получаешь полный путь к схеме и указывешь его парсеру вот так -> saxParser.setProperty(JAXP_SCHEMA_SOURCE,
new File(schemaSource-здесь путь, Генерируется динамически!)).

зы это все верно если я правильно понял твою проблему :)
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32983367
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нашел правильное решение. Называется XML Catalog !
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32983431
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriЯ нашел правильное решение. Называется XML Catalog !
Это и есть то самое, что я тебе объяснить пытался, только в своё время я сам подобное написал.
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32983449
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не тоже самое, далеко не тоже самое :)
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32983551
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuriЭто не тоже самое, далеко не тоже самое :)

Ну разве это не то же самое, что я тебе объяснял ?:)

автор
Example 2: W3C XML Schema Validation

In the same way that an XML document may associate itself with a DTD via the DOCTYPE declaration, an XML document may associate itself with a W3C XML Schema using a schema location hint. This example looks at how to validate a document against a schema specified in this way.

A schema location hint is an xsi:schemaLocation attribute on an element -- typically the root -- whose value is a list of namespace URIs and URIs for the schemas to validate elements in those namespaces. Alternatively, if the elements are not in a namespace, a schema location hint is an xsi:noNamespaceSchemaLocation attribute whose value is a URI for the schema. The xsi prefix is bound to the http://www.w3.org/2001/XMLSchema-instance namespace URI.

For example, here is an XML instance document that describes a recipe, and declares itself to be valid with respect to the schema located at http://tiling.org/xmlcatalogs/schemas/recipe.xsd in the http://tiling.org/xmlcatalogs/namespaces/recipe namespace:

<?xml version="1.0" encoding="UTF-8"?>
<recipe
xmlns="http://tiling.org/xmlcatalogs/namespaces/recipe"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://tiling.org/xmlcatalogs/namespaces/recipe
http://tiling.org/xmlcatalogs/schemas/recipe.xsd">

<author>Elizabeth David</author>
<name>Omelette</name>
<ingredient>3-4 eggs</ingredient>
<ingredient>1/2 oz. butter</ingredient>
<ingredient>Salt and pepper</ingredient>
<method>Beat the eggs...</method>
</recipe>

Although not explicitly marked as a system identifier we can use a catalog with a system element to associate the schema with a local copy.

<?xml version="1.0" encoding="UTF-8"?>
<catalog
xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

<system
systemId="http://tiling.org/xmlcatalogs/schemas/recipe.xsd"
uri="catalog/recipe.xsd"/>

</catalog>
...
Рейтинг: 0 / 0
xml scheme validation используя xerces
    #32984389
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты предложил подставлять путь к схеме с помощью
Код: plaintext
1.
saxParser.setProperty(JAXP_SCHEMA_SOURCE,
			     new  File(schemaSource));
Т.е. мне нужно было сначало каким-то образом прочитать информацию о схеме из документа, а затем повторно провести парсинг уже с конкретным путем к схеме


Напротив в ссылке которую привел я во время парсинга используется CatalogResolver, который заменяет ссылки на схему в документе на локальную.

Общего только map-подобная структура хранения глобальных/локальных путей к схемам - это да - только используется эта информация по-разному!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / xml scheme validation используя xerces
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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