Ahogy az előző részben megállapítottuk, a Word 2007 alapértelmezett Open XML fájl formátumainak programozott módon történő közvetlen kezelése nem éppen kellemes élmény. Bár kapunk támogatást a fájl kibontásához és a részek eléréséhez, sőt az egyes részek tartalmát is tudjuk szerkeszteni, ez utóbbinak a megalkotása során váratlan akadályokba ütközhetünk. Mindennek pedig az az oka, hogy a Word ML nyelvben a tartalom, azon belül is a sok sallang között a dokumentum információtartalma és a megjelenítés bizony elég erősen keveredik.
A szétválasztásra szerencsére van lehetőség, és a megoldás lelke természetesen az XML.
1. Custom XML
Ha már a Word XML támogatása szóba került, mindenképpen meg kell említenünk a Custom XML szolgáltatást, amely már megvolt a Word 2003-ban is és lényegében nem is változott a 2007-es verzióban. Ennek a funkciónak a lényege, hogy a dokumentumunkhoz hozzárendelünk egy XSD sémát, majd definiáljuk, hogy melyik szövegrész melyik XML elemnek felel meg. Végül a Word Mentés ablakában kiválasztjuk, hogy nem az egész dokumentumot akarjuk menteni Word formátumban címestül, bekezdésestül, formázásostul, hanem csak az információk alapján előállított nyers XML-t.
Ennek a szolgáltatásnak tehát az a célja, hogy a szövegből ki tudjuk nyerni a lényegi információt, mellőzve minden körítést. A módszer sajnos nem alkalmas dokumentum előállítására, a mentéskor előálló XML és az eredeti dokumentum között nincs kapcsolat és nem tudok olyan módszerről, ami lehetővé tenné, hogy egy adott XML tartalmát jelenítse meg a Word a sablon dokumentumunkban. Krisztián számára viszont jó hír, hogy tökéletesen kezeli a táblázatokat 😉
Vegyük például az alábbi dokumentumot, amely egy tanfolyami ajánlatot tartalmaz:
Ha az a feladatunk, hogy ebből kellene kinyernünk az oktató nevét, óraszámot illetve az érintett témákat, akkor használhatjuk a Custom XML szolgáltatást. Ehhez először készítenünk kell egy XSD sémát. Bevallom nem sűrűn gyártok sémát, az XSD szintaktika nem megy fejből, ezért inkább gyártottam egy XML dokumentumot Visual Studioval, pont olyan felépítésűt, amire szükségem van a Word feldolgozásnál is:
<?xml version="1.0" encoding="utf-8"?>
<Tanfolyam>
<Oktato>Oktató neve</Oktato>
<Oraszam>111</Oraszam>
<Tartalom>
<Tema>
<Cim>Elsé téma</Cim>
<Szint>könnyű</Szint>
</Tema>
<Tema>
<Cim>Második téma</Cim>
<Szint>közepes</Szint>
</Tema>
<Tema>
<Cim>Harmadik téma</Cim>
<Szint>nehéz</Szint>
</Tema>
</Tartalom>
</Tanfolyam>
Miután ez megvolt, megkértem a Studiot, hogy generáljon ebből XSD-t:
Íme az eredmény, amit így nem kellett megírnom:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Tanfolyam">
<xs:complexType>
<xs:sequence>
<xs:element name="Oktato" type="xs:string" />
<xs:element name="Oraszam" type="xs:unsignedByte" />
<xs:element name="Tartalom">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Tema">
<xs:complexType>
<xs:sequence>
<xs:element name="Cim" type="xs:string" />
<xs:element name="Szint" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Megvan tehát a séma, irány a Word! Először is elő kell varázsolnunk a szalagra a Developer fület, amit a Word options ablakban tehetünk meg:
Ha megjelent a Developer tab, bökjünk rá az XML csoportban található Structure gombra, majd a megjelenő jobb oldali XML Structure munkaablakban a Templates and Add-Ins… linkre:
A felugró Templates and Add-Ins ablakban az Add Schema gombra kattintva válasszuk ki a korábban előállított XSD fájlunkat és adjuk meg a hozzá tartozó névtér URI-t. Ez lesz a Word által generált XML dokumentum alapértelmezett névtere, tehát jól gondoljuk ki, mit adunk meg:
Innentől kezdve nincs is más dolgunk, mint a szöveg egyes részeit kijelölni és a munkaablak alsó részében rábökni az alkalmazandó XML elem nevére, aminek hatására lila jelölők tűnnek fel a dokumentumban, ha a Show XML tags in the document opciót bekapcsoljuk:
Az ablak legalsó opcióját érdemes bekapcsolva hagyni: a List only child elements of current element azt jelenti, hogy a Word követi merre jár a kurzorunk a dokumentumban és csak azokat az elemeket kínálja fel, amik a séma alapján ott elérhetőek. Ez sokat segít.
Célszerű figyelni a munkaablak felső részében a sárga bejegyzéseket, amelyek felett tooltipben megjelenik, ha valamelyik elemet nem a sémának megfelelően használjuk.
Hasznos beállítási lehetőségeket találunk, ha a legalsó XML Options linkre kattintunk:
A Save data only bekapcsolásával érhetjük el, hogy csak az adatok mentődjenek, a formázás ne, sőt megadhatunk egy XSL transzformációt is, amit mentésnél alkalmaz a Word.
A validálási lehetőségek között szerintem célszerű bekapcsolni az Ignore mixed content opciót. Ezt bekapcsolva a Word eltekint az általunk XML elemként megjelölt részek közötti egyéb szövegtől. E nélkül a sémában a szabadszöveges részeket is definiálnunk kellene.
Érdemes kipróbálni, hogy a Word felismeri a táblázatokat, így ha később a táblázatba újabb sorokat szúrunk be, azokra is alkalmazni fogja az előző sor XML séma beállításait. Ha bekapcsoljuk a Show placeholder text for all empty elements opciót, akkor még az is látszik messziről, hogy a szöveg mely részét kell kitöltenie a felhasználónak (ez persze nem csak táblázatnál működik):
Ha készen vagyunk a dokumentum felcímkézésével el is menthetjük és odaadhatjuk a felhasználóknak. Miután ők megszerkesztik a szöveget csak arra kell figyelniük, hogy a Save As dialógus ablakban Word 2003 XML Document típust válasszanak ki és jelöljék be a Save data only opciót:
Fontos, hogy Word 2003 XML Document a típus neve és nem 2007! Íme az eredmény:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Tanfolyam xmlns="www.msdnkk.hu">
<Oktato>Balássy György</Oktato>
<Oraszam>24</Oraszam>
<Tartalom>
<Tema>
<Cim>Bevezetés a SharePoint objektum modell használatába</Cim>
<Szint>könnyű</Szint>
</Tema>
<Tema>
<Cim>SharePoint webszolgáltatások</Cim>
<Szint>könnyű</Szint>
</Tema>
<Tema>
<Cim>Alkalmazás oldalak</Cim>
<Szint>közepes</Szint>
</Tema>
<Tema>
<Cim>Feature Framework</Cim>
<Szint>közepes</Szint>
</Tema>
<Tema>
<Cim>nincs címe</Cim>
<Szint>nincs szintje</Szint>
</Tema>
<Tema>
<Cim>Eseménykezelők</Cim>
<Szint>közepes</Szint>
</Tema>
<Tema>
<Cim>Webkijelzők készítése</Cim>
<Szint>közepes</Szint>
</Tema>
<Tema>
<Cim>Munkafolyamatok fejlesztése</Cim>
<Szint>nehéz</Szint>
</Tema>
</Tartalom>
</Tanfolyam>
Innen már aztán gyerekjáték akármilyen alkalmazásban feldolgozni az adatokat, hiszen ez standard XML, semmilyen formázást, Word ML-t vagy egyéb Word specifikus részt nem tartalmaz. Aki nem hiszi, innen letöltheti a cikkhez tartozó fájlokat. Persze az igazán szép az lenne, ha rá tudnánk kényszeríteni a felhasználókat, hogy mindig ebben a formátumban mentsenek, én erre sajnos nem találtam módszert 😦 Ha valaki tud, írja meg!
Sajnos ahogy azt korábban említettem, ezzel az XML-es módszerrel nem tudunk dokumentumot generálni. Csak arra jó, hogy a szövegből kinyerjük az adatokat, tudomásom szerint nem lehet megfordítani a folyamatot. Szerencsére van egy másik, szintén XML alapú szolgáltatás a Wordben, ami nem csak a dokumentum előállítását, de az adatkötésen alapuló generálást is biztosítja.
(folytatjuk)