wtorek, 15 września 2009

Java, walidator XML Schema i świadomość przestrzeni nazw

Kiedy pracowaliśmy zespołem nad Teleradiologią i chciałem napisać testy JUnit do swojego modułu kręcącego się wokół XML-i napotkałem ciekawy problem. Parser korzystający z XML Schema działał świetnie, natomiast przy uruchamianiu testów jednostkowych odpowiednich metod pojawiał się wyjątek SAX:

"cvc-elt.1: Cannot find the declaration of element nazwa elementu głównego".

Z powodu napiętego terminarza itd. po paru godzinach odpuściłem temu bykowi, który był spowodowany nie-wiadomo-czym (bo element był i w XML, i w Schema)...

Ostatnio okazało się, że błąd wynikał z mojej niewiedzy. Mianowicie walidator ten był napisany (patrząc z perspektywy czasu) trochę na około i wykorzystywał m.in. dokumenty DOM i klasę DocumentBuilderFactory.
A ta fabryka domyślnie tworzy budowniczych, którzy nie są świadomi przestrzeni nazw w tworzonych dokumentach DOM (namespace aware)...

Czyli gdy zamiast

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();


Napisze się

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder parser = factory.newDocumentBuilder();


To wszystko powinno śmigać ;)

Powróciłem do tego problemu, kiedy kolega chciał na moim kompie zbudować swój projekt i przy testach JUnit napotkał znany mi problem. U niego na Javie SE wszystko działa, więc może jest to specyfika J2EE - ciekawe...

2 komentarze: