Ja nejak tak v kutiku duse od zaciatku toho threadu pocitujem, ze
autor chce "generator xml na zaklade xsd" z akychysi vymyslenych
hodnot ( splnajucich podmienky na validitu vysledneho dokumentu ). Je
to tak?
To predsa technicky nie je ziaden problem, aj ked som sa osobne so
ziadnou takou utilitou zoci-voci este nestretol. Mozno take cosi vedia
nejake sofistikovanejsie xml/xsd editory typu komodo a spol.
--
Dusan
2011/4/19 Vladislav Krejčiřík <[email protected]
<mailto:[email protected]>>
Rozumim tomu co pisete, ja s tim souhlasim. Obecne to tak je. Ale
jak jsem psal, u me je to hodne specificky priklad. XSD se nemeni
za behu aplikace. Jsou pevne dane pred spustenim aplikace. Postup
je takovy, ze uzivatel nahraje potrebna XSD do daneho adresare.
Potom spusti aplikaci. Aplikace si tato XSD nahraje a pomoci XSOMu
naparsuje. Pomoci XSOMu je schopna zjistit informace z anotaci...
Data vim kam budu vyplnovat. U kazdeho elementu mam anotaci ktera
obsahuje key, identifikator toho jakou hodnotu tam mam vlozit.
Takze jak jsem psal, tak asi jedinym zpusobem ktery me napadl je
projit objektovou reprezentaci XSD a vytvaret XML message. Tam kde
narazim na element s anotaci tak tam vlozim podle zadaneho key
hodnotu. Tuto message pak poslu. V podstate jak asi spravne pisete
tak jiny zpusob ani neni mozny..
Je to velice specificke XSD. Mozna jsem mel rict ze XSD je
vytvareno XSD designerem treti strany. Tento designer neumoznuje
vytvorit jinou strukturu XSD nez ktera je pozadovana aplikaci.
Tzn. jeden complexType se sequenci ktera obsahuje elementy ruznych
typu.
Diky za pripominky a navrhy
2011/4/19 Petr Novak <[email protected]
<mailto:[email protected]>>
Stejně asi jako ostatní si myslím, že to, co chcete vytvořit
je tak trochu nesmysl. Možná to bude fungovat ve velmi omezené
podobě na drobné změny v xsd, ale i to, že žádná podobná
knihovna asi vůbec neexistuje svědčí o tom, že takto se tato
problematika neřeší.
To budete psát parser s umělou inteligencí, který umí
odpovídat na jakýkoliv dotaz - ty příklady se slovenštinou
byly přesný :) . Jak už tu bylo několikrát uvedeno, těžko
můžete vyplňovat data, která ani nevíte kam budete vyplňovat,
případně, když po Vás XSD bude vyžadovat nové položky, tak to
byste pak k tomu musel dynamicky dogenerovat i nějakou logiku
v aplikaci, která by je vypočítala a doplnila a nebo to
napojit na křišťálovou kouli :).
Nevím jak často a jak moc se Vám ta XSD mění a kdo je jejich
dodavatelem (jestli to je v rámci projektu, nebo externě).
Ale z principu věci pokud Vám někdo mění to XSD - tedy
vzdálené rozhraní, tak buď musí dělat kompatibilní změny, pak
vy nemusíte nic měnit a nepotřebujete dynamické generování
XML, protože to Vaše naimplementované bude stále validní. A
nebo dělá nekompatibilní změny a pak vy musíte vytvořit novou
knihovnu na základě nového XSD - standardní
Change-Request-management. Pak by ty XSD měly být verzované,
atd.. Navíc, pokud ta změna bude až takového rázu, že tam
přibude třeba datový element navíc, tak to stejně může
znamenat, že musíte upravit dotazy do DB, apod. abyste ty data
vůbec získal a mohl je vložit do XML.
Vždy když slyším podobný požadavek od svých kolegů, tak jim
vysvětlím, co je to API a XSD je API a všem, co něco takového
navrhují doporučuji nastudovat
http://wiki.apidesign.org/wiki/Main_Page a především celou tu
knížku Jardy Tulacha, a je úplně jedno, že to není o XSD,
protože principy jsou stále stejné. Ale chápu, že jste možná
v situaci, kdy Vám to API dodává třetí strana, která neumí
držet zpětnou kompatibilitu a neustále něco mění - pak jsou
jen 2 řešení - buď změnit dodavatele a nebo udělat mezivrstvu,
která bude tuto nekompatibilitu řešit. I o tom je v té knize
povídáno - řešení závislostí na třetích stranách.
Proto se asi v těchto případech používají různé integrační
servery, ESB, apod. - vlastně tvoří tu mezivrstvu. A tak mě
napadá, že tím se můžete i inspirovat a použít XSL.
Udělat to více volně vázané, tedy vy budete generovat nějaké
své statické XML, které budete přes XSL transformovat na to
požadované XML odpovídající tomu XSD. Ale ani to XSL
nedokážete asi generovat dynamicky podle XSD. Ale mělo by to
výhodu v tom, že nemusíte programovat, kompilovat, deployovat,
apod. Prostě jen budete měnit transformační šablony umístěné
v adresáři mimo.
A nebo ještě mě napadlo použít šablony na generování toho XML
z dat - tedy třeba vzít freemarker, nebo velocity - udělat
si v něm šablonu XML elementů (prostě šablonu té message) a na
patřičná místa doplňovat jen hodnoty. A když se změní API v
podobě změny XSD, tak hold musí někdo sednout a ty šablony
upravit pro tu novou verzi. A opět se nemusí řešit žádná
kompilace, apod. Prostě jen nahrajete nová XSD, upravíte
šablonu, vygenerujete si zkušební XML, proženete ho přes XSD
validator, tím ověříte, že vše je OK, že šablona generuje
správná XML, která pak můžete v klidu posílat dál do fronty.
A nebo použít nějaký dynamický jazyk a skládat to jako DOM
mimo javu, aby ty změny byly jednodušeji zapracovatelné -
groovy, ruby, apod. Vlastně je to podobné těm šablonám, jen
jiný způsob.
Tak snad to dá zase trochu jiný pohled na Váš problém ...
Dne 19.4.2011 15:27, Vladislav Krejčiřík napsal(a):
Aplikace funguje nasledovne:
Pri startu si aplikace natahne vsechny XSD ze zadaneho
adresare. Pak potrebuju ke kazde XSD definici udelat validni
XML message do ni vlozit potrebne hodnoty a poslat na zadanou
queue.
XSD definice ktere slouzi jako vstup jsou znacne omezene.
Obsahuji jen jeden ComplexType se sequenci elementu ruznych
typu. Ale chapu ze tohle je specialni pripad a obecne to
jiste nelze..
Postup vyuziti xjc pro vygenerovani pomocnych trid neni podle
me v mem pripade vhodny.. Situace je velice podobna pripadu,
kdyz by se XSD menily za behu.
Je nejaky obecny postup sestavovani validnich XML message z
dynamicky se menicich XSD?
Dekuji za vase nazory.
XSD muze vypadat takto:
<?xml version="1.0" encoding="ibm852"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="L1_L2_CyclicDataRM">
<xs:annotation>
<xs:appinfo>
<Transport>EMS</Transport>
<MessageType>Queue</MessageType>
<MessageName>ems.topic.L1_L2_CyclicDataRM</MessageName>
<Timer>2000</Timer>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:element name="Bucket__Brigade">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="ArrayOfString"
type="xs:string">
<xs:annotation>
<xs:documentation>Bucket Brigade.ArrayOfString</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="UInt2" type="xs:unsignedShort">
<xs:annotation>
<xs:documentation>Bucket Brigade.UInt2</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Boolean" type="xs:boolean">
<xs:annotation>
<xs:documentation>Bucket Brigade.Boolean</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Int1" type="xs:string">
<xs:annotation>
<xs:documentation>Bucket Brigade.Int1</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Square__Waves">
<xs:complexType>
<xs:sequence>
<xs:element name="UInt1" type="xs:byte">
<xs:annotation>
<xs:documentation>Square Waves.UInt1</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Real8" type="xs:double">
<xs:annotation>
<xs:documentation>Square Waves.Real8</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Int2" type="xs:short">
<xs:annotation>
<xs:documentation>Square Waves.Int2</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
2011/4/19 Robert Novotny <[email protected]
<mailto:[email protected]>>
Vezmime si priklad zo slovenciny. Mam gramatiku, ktora
hovori, ze slovenska veta ma mat:
Podmet - prisudok - predmet.
Validacia sa pyta, ci veta ,,Pes zerie granule" splna
gramatiku. Vy vsak chcete riesit problem typu
,,potrebujem vyrobit slovensku vetu". Ako ma kniznica
vediet, ci ma vygenerovat slovensku vetu ,,Pes zerie
granule" alebo ,,Vyvojar miluje Javu" alebo ,,Ja mam psa"?
Ako sa spominalo, JAXB na zaklade XSD vyrobi triedu s
instancnymi premennymi podmet, prisudok, predmet a
anotaciami zaisti, ze objekt sa serializuje spravne a
teda ze vysledne XML bude splnat schemu.
Ako nad tym uvazujem, tak bud chcete mat v kode
obmedzene, aby ste nevymysleli nahodou spravu, ktora
nedava zmysel (,,Vonku prsi"), lenze to vam zaisti prave
typovy system, ktory je reprezentovany prave triedami,
ktore su vygenerovane v JAXB.
Vy hovorite, ze nechcete generovat ziadne triedy
,,ukladane na filesystem", ale mne to nie je jasne.
Typicky workflow znamena, ze mam XSD, v kompilacnom kroku
z neho vypadnu klasicke Java triedy a tie pouzivam uplne
rovnako ako akekolvek ine triedy. Alebo mate situaciu,
ked sa XSD meni za behu?
RN
On 19. 4. 2011 14:11, Vladislav Krejčiřík wrote:
ok, mozna jsem to spatne popsal. Zkusim znovu. Ja nechci
nic validovat, protoze nemam vlastne ani co. XSD mi
definuje strukturu nejake message. Ja bych potreboval
takovou messge umet vytvorit, "vygenerovat" z XSD
definice. Myslel jsem ze bych ziskal nejakou objektovou
reprezentaci te XML message kde bych nastrkal hodnoty co
potrebuju. Potom bych uz jen XML message poslal do fronty.
Nevim jestli existuje nejaka knihovna, ktera to
umoznuje. Nebo budu muset rucne takovou XML vystavet..
Dne 19. dubna 2011 12:48 Lukas "lzap" Zapletal
<[email protected]
<mailto:[email protected]>> napsal(a):
Vlado,
myslim ze se tady snazis michat dve veci. DOM a XSD.
Prvni jmenovany slouzi
k manupulaci s (ted to zjednodusim) XML, druhy je
urcen pro popis a kontrolu
XML dokumentu. Krome jineho lze namapovat na
JavaBeany a ruzne jine
struktury zname z pocitacovych jazyku.
To co asi chces je nejprve dokument zvalidovat
pomoci XSD schematu
(doporucuji ruzne tutorialy na netu), a pote jej
proste a jednoudse nacist
do DOMu a parsovat. Je mozne, ze nejaka DOM knihovna
to bude umet udelat "v
jednom", ale v podstate jsou to dve ruzne veci.
Nebo jsem te mozna spatne pochopil. Zkus to
reformulovat.
http://en.wikipedia.org/wiki/Document_Object_Model
http://en.wikipedia.org/wiki/XML_Schema_(W3C)
<http://en.wikipedia.org/wiki/XML_Schema_%28W3C%29>
-----
Later,
Lukas
--
View this message in context:
http://konference-java-cz.958153.n3.nabble.com/Vytvoreni-instance-XML-objektu-z-XSD-definice-tp2837707p2838272.html
Sent from the konference java.cz <http://java.cz>
mailing list archive at Nabble.com.
--
/**************************************/
Best regards / S pozdravem
Vladislav Krejčiřík
http://www.vkrejcirik.info
--
/**************************************/
Best regards / S pozdravem
Vladislav Krejčiřík
http://www.vkrejcirik.info
--
Petr
--
/**************************************/
Best regards / S pozdravem
Vladislav Krejčiřík
http://www.vkrejcirik.info