XML Schema kezelés javaban, eclipse xsd vagy más...

Fórumok

Üdv!

Kellene nekem egy olyan java lib, amelyik képes az xml schemakat kényelmes objektumokba tölteni, kényelmes függvényekkel mint például: "Xy tag milyen tag-eket tartalmazhat?"

A org.w3c.dom simán megcsinálja ezt xml-ekre.
Mivel a schema is xml, ezért simán megírhatnám a saját kis függvényeimet tudom...
de nem akarok semmit újra feltalálni.

Megtaláltam az eclipse xsd-t. Erre találták ki. (Egy kicsit nagy, ami -1.)
Már pár napja b*g*om, de még nem tudtam a tutorialt se beüzemelni...
http://www-128.ibm.com/developerworks/forums/thread.jspa?threadID=20896…
Nem adtam fel, mert menni fog ez... de most már rákérdezek:

Van valakinek ilyen tapasztalata(schema, java, xsd)?
Van más lib az eclise xsd-n kívül?

Kösz
cs

Hozzászólások

Elolvasgattam... de amennyire én értem a JAXB arra jó, hogy a Schema alapján osztályokat generál, amibe aztán a a Schemat használó XML fájlokat könnyedén lehet be/ki töltögetni (unmarshall/marshall).

Aztán lehet h arra is jo amire nekem kéne, de ez számomra a homályban maradt... Ez a jaxb csak tipp volt, hogy hátha, vagy használtad olyasmire ami nekem kéne?

Te magát a sémát (xsd) akarod manipulálni? Akkor bocs, én úgy értettem, hogy betöltöd a séma szerinti xml fájlokat kényelmes kis objektumokba és azokat bizgerálod. Ez esetben elnézésed kérem, hogy tévútra vittelek és pazaroltam az idődet.
De az eclipse-nek egész jó a séma szerkesztője, szerintem. Ha már tényleg azt akarod szerkeszteni "vizuálisan". Ha nem, akkor notepad/vi és adjad neki. :D

Nem! Nem akarom a sémát manipulálni. A sémáról szeretnék _könnyedén_ információt lekérdezgetni. Erre mondtam példának, hogy egy adott xmltag milyen gyermek tageket foglalhat magába. A JAXB másra való, de lehet ezt is tudja. Jól értem?

Konkrétan:

A JAXB-ben miután felépítettem a sémat reprezentáló osztályokat tudok olyat, hogy mondjuk "xpath szerűen" megadok egy tag-et és lekérdezem, hogy annak milyen gyermek tagjei lehetnek?

Elmondom miért kell és rögtön érteni fogsz. Szeretnék csinalni egy un. schema aware xml editort, ami csak olyan lehetőségeket kínál fel, amit a schema alapján szabad. Tudom hogy nem nagy szám, szal tekintsd házinak, vagy gyakorlásnak.

Azóta találtam egy egyetemi kódot:
http://dynvocation.selfip.net/xsd4j/
ami tök jól memóriába rakja a sémám, a lekérdezgetés megy is, viszont nem jövök rá, vagy lehet nem is tudja, hogy xpath szerűen lehessen megtalálni node-ot, és csak utána lekérdezgetni.

A JAXB-vel egyszerűen manipulálhatsz xml-t. Az xsd alapján generál neked egy java objektum hierarchiát, megfelelő set és get metódusok mindenütt, hogy a tageket könnyen lehessen manipulálni ezeken keresztül. Az xml beolvasása és kiírása is hasonlóan egyszerűen megoldott (marshall, unmarshall).
Ha megadsz egy tag-et (=objektum), akkor az nyilván tudja magáról, hogy milyen gyermekei vannak (=set és geteken keresztül manipulálhatóak). De nem fogja kiadni, hogy na akkor ezek és felsorolja. Persze ki lehet kaparni a Class osztály getMethods, getFields, getAkármi hívásaival, hogy mi minden van az osztályban. De ez se nem szép, se nem elegáns, szerintem. Biztos van erre más célszerszám is.

OK. Sikerült beüzemelnem az eclipse xsd-t.
http://wiki.eclipse.org/index.php/MDT-XSD-FAQ#Standalone_Uses

Csak a tanulság miatt, hátha másnak is nehéz elindulni, íme egy kis kód:

szükséges jar-ok:
org.eclipse.emf.common_2.3.2.v200802051830.jar
org.eclipse.emf.ecore.change_2.3.0.v200802051830.jar
org.eclipse.emf.ecore_2.3.2.v200802051830.jar
org.eclipse.xsd_2.3.2.v200802051830.jar

import:


import java.util.Iterator;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSchemaContent;
import org.eclipse.xsd.impl.XSDElementDeclarationImpl;
import org.eclipse.xsd.util.*;

használat:


public schanal2() {
		URI uri = URI.createFileURI("proba.xsd");
		ResourceSet resourceSet = new ResourceSetImpl();
		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().
			put("xsd", new XSDResourceFactoryImpl() );
		XSDResourceImpl xsdResource = (XSDResourceImpl) resourceSet.getResource(uri,
				true);
		XSDSchema xsdSchema = xsdResource.getSchema();
		
		EList xcc = xsdSchema.getContents();
		for(Iterator i = xcc.iterator();i.hasNext();){
			XSDSchemaContent cont = (XSDSchemaContent)i.next();
			if(cont instanceof XSDElementDeclarationImpl){
				System.out.println("elem:"+cont.toString());
			}
			System.out.println(cont.toString());
		}

	}

Kösz, a segítséget! GL

A következő problémám van, sajnos nem találtam rá megfelelő fórumot.
XML Schemaban szeretném azt definiálni, hogy biznyos típusok egyes attribútumai a dokumentumon belül egyediek legyenek, valamint azt, hogy más típusban csak már definiált ID-vel rendelkező elemre lehessen hivatkozni.

Egy konkrétabb példa szemléltetés gyanánt:


<authors>
<author name="akarmi" />
<author name="akarmi2" />
</authors>
<books>
<book title="titleex1" author="akarmi" />
<book title="titleex2" author="akarmi" />
<book title="titleex3" author="akarmi2" />
</books>

Hogyan lehet XML Schemaban definiálni, hogy a book elem author attribútumának értéke csak az authors alatt az author elemek name értékei közül kerülhet ki?

Szerintem semaban sehogy, mert nem erre valo.
XSLT-vel tudsz ellenorizni, en inkabb ebbe az iranyba mennek el. A kimenet a felteteleknek teljesen megfelelo XML fa, a hibas objektumok kidobasaval.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.