Tento týždeň som dostal zaujímavú úlohu: odprašovanie starovekej aplikácie Java. Aplikácia analyzuje špecifické súbory XML v proprietárnom formáte. Viem, že XML neznie sexy pre mladších vývojárov, ale má úžasnú výhodu. Jeden môže overiť súbor proti gramatike. Takáto gramatika sa nazýva XSD, skratka pre definíciu schémy XML. Zábavná skutočnosť: píšete XSD v XML. V tomto príspevku vysvetľujem problém, čo som vyskúšal a konečné pracovné riešenie. Problémom Dobrá vec je, že aplikácia už používa XSD. Avšak, v čase spustenia aplikácie, XSD validácia bola v → pridal niekoľko významných funkcií. najmä v1.1 pridáva a . Verzia 1.0 Verzia 1.1 tvrdenia Identitné obmedzenia V kóde Java bolo veľa komentárov, ktoré nebolo možné implementovať v XSD 1.0, ale v XSD 1.1. Myslel som si, že by bolo ľahké inovovať. Naivný prístup Pod kapotou JDK používa na analýzu zabalenú implementáciu Xerces. Pre zábavu skontrolujte balík `com.sun.org.apache.xerces.internal.jaxp` vo vašich nainštalovaných JDK. Táto implementácia je pripútaná k validácii XSD 1.1. Predpokladal som, že projekt by sa posunul ďalej a implementoval ho. pridal som najnovšiu verziu do svojej zostavy a ... nič. Pravidelné Xerces public final class Constants { /** XML 1.1 feature ("xml-1.1"). */ public static final String XML_11_FEATURE = "xml-1.1"; // Constant to enable Schema 1.1 support public final static boolean SCHEMA_1_1_SUPPORT = false; public final static short SCHEMA_VERSION_1_0 = 1; public final static short SCHEMA_VERSION_1_0_EXTENDED = 2; } - s Konštantín - Java Konštantín - Java Ak ste zmätení, pretože schéma 1.1 podpora je konštantná, vitajte v mojom svete. Projekt má dve potenciálne zaujímavé pobočky. a • The Trieda v predchádzajúcej pobočke vyzerá takto: Červená J xml-schema-1.1-dev xml-schema-1.1-tests Constants public final class Constants { /** XML 1.1 feature ("xml-1.1"). */ public static final String XML_11_FEATURE = "xml-1.1"; // Constant to enable Schema 1.1 support public final static boolean SCHEMA_1_1_SUPPORT = false; public final static short SCHEMA_VERSION_1_0 = 1; public final static short SCHEMA_VERSION_1_0_EXTENDED = 2; public final static short SCHEMA_VERSION_1_1 = 4; } 1. stále nie je podporovaný 2 Ale vyzerá to sľubne? - Konštantné. java Konštantín - Java Hľadal som takýto artefakt : nezobrazuje žiadny zasvätený artefakt. Maven centrálne V tej dobe mi to neprišlo na myseľ, ale pri písaní príspevku som skontroloval: stránka ponúka distribúciu XSD 1.1. To by znamenalo získať JAR, vytvoriť dummy POM a publikovať ich na vnútornej Artifactory, ku ktorému nemám písomný prístup. Xerces na stiahnutie Hľadanie alternatív Hľadal som alternatívy, ale jediný, ktorý som našiel, bol Saxon. Saxon Package je zbierka nástrojov na spracovanie XML dokumentov. Procesor XSLT, ktorý môže byť použitý z príkazového riadka alebo vyvolaný z aplikácie pomocou dodaného rozhrania API. Saxon implementuje odporúčanie XSLT 3.0. Produkt môže byť tiež použitý na spustenie hárkov štýlov XSLT 2.0 alebo hárkov štýlov XSLT 1.0 v režime spätnej kompatibility. Procesor XPath prístupný aplikáciám prostredníctvom dodaného rozhrania API.Toto podporuje XPath 2.0 a XPath 3.1.Môže byť tiež použitý v režime spätnej kompatibility na hodnotenie výrazov XPath 1.0. An XQuery processor that can be used from the command line, or invoked from an application by use of a supplied API. This supports XQuery 3.1, which also allows XQuery 1.0 or 3.0 queries to be executed. With Saxon-EE, you can also use the XQuery extensions defined in the XQuery Update 1.0 Recommendation, but later working drafts of XQuery Update are not supported (W3C has abandoned work on these versions). An XML Schema Processor. . This can be used on its own to validate a schema for correctness, or to validate a source document against the definitions in a schema. It is also used to support the schema-aware functionality of the XSLT and XQuery processors. Like the other tools, it can be run from the command line, or invoked from an application. This supports both XSD 1.0 and XSD 1.1 Saxon Package je zbierka nástrojov na spracovanie XML dokumentov. Procesor XSLT, ktorý môže byť použitý z príkazového riadka alebo vyvolaný z aplikácie pomocou dodaného rozhrania API. Saxon implementuje odporúčanie XSLT 3.0. Produkt môže byť tiež použitý na spustenie hárkov štýlov XSLT 2.0 alebo hárkov štýlov XSLT 1.0 v režime spätnej kompatibility. Procesor XPath prístupný aplikáciám prostredníctvom dodaného rozhrania API.Toto podporuje XPath 2.0 a XPath 3.1.Môže byť tiež použitý v režime spätnej kompatibility na hodnotenie výrazov XPath 1.0. Procesor XQuery, ktorý môže byť použitý z príkazového riadka alebo vyvolaný z aplikácie pomocou dodaného rozhrania API. To podporuje XQuery 3.1, ktorý tiež umožňuje spustenie dotazov XQuery 1.0 alebo 3.0. S Saxon-EE môžete tiež použiť rozšírenia XQuery definované v odporúčaní aktualizácie XQuery 1.0, ale neskoršie pracovné návrhy aktualizácie XQuery nie sú podporované (W3C opustila prácu na týchto verziách). Procesor schém XML. Podporuje XSD 1.0 a XSD 1.1. Môže byť použitý samostatne na overenie schémy pre správnosť, alebo na overenie zdrojového dokumentu proti definíciám v schéme. Používa sa tiež na podporu schématickej funkčnosti procesorov XSLT a XQuery. Rovnako ako ostatné nástroje, môže byť spustený z príkazového riadka alebo vyvolaný z aplikácie. Čo je Saxon? Čo je Saxon? Po trochu vyšetrovaní som zistil, že Sax mal dve hlavné nevýhody: Hoci je možné použiť bežné rozhranie JAXP API, musíte prejsť na vlastné rozhranie Saxon API, aby ste odomkli jeho plný výkon. Saxon prichádza v dvoch príchutiach: Enterprise Edition je platená a Home Edition je zadarmo. Nemal som žiadny rozpočet a čas na lov. Späť na Námestie 1 Bol čas prehodnotiť situáciu. Budovanie zo zdroja? Nie je uskutočniteľné. Saxon? Platiť. Moja posledná nádej bola AI. Musím povedať, že raz, to bolo záchranár. Ukázalo sa, že dve zostavy Xerces s funkciami XSD 1.1 existujú na Tie boli publikované OpenGIS v rokoch 2015-2016, v čase, keď to bolo celkom jednoduché publikovať tam. V skutočnosti uvádza, z ktorej pobočky pochádza: . Maven centrálne ich Pom http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/ V tomto bode som bol niekoľko riadkov kódu ďaleko od cieľa: var schemaFactory = SchemaFactory.newInstance(Constants.W3C_XML_SCHEMA11_NS_URI); var schema = schemaFactory.newSchema(schemaFile); var saxParserFactory = SAXParserFactory.newInstance(); saxParserFactory.setNamespaceAware(true); saxParserFactory.setSchema(schema); var reader = saxParserFactory.newSAXParser().getXMLReader(); reader.setContentHandler(handler); reader.setErrorHandler(handler); reader.setEntityResolver(handler); Nastavenie verzie XSD 1.1 Nastavte schému do továrne Pravidelné SAX parsing Stále potrebujem správne overiť, že z tejto "divokej" zostavy nie je žiadny bezpečnostný problém, ale funguje to: môžem využiť funkcie z XSD 1.1! záver V tomto príspevku som opísal svoju cestu implementácie validácie XSD 1.1 v Java. Je to oveľa menej jednoduché, než som očakával na prvom mieste, ale dúfam, že to pomôže ostatným, ktorí sa ocitnú v rovnakej situácii. A ísť ďalej: Java API pre spracovanie XML (JAXP) Projekt Apache XercesTM Pôvodne publikované na A Java Geek Ako používať Java Geek