השבוע, קיבלתי משימה מעניינת: אבקת יישום Java עתיק. היישום מנתח קבצים XML ספציפיים בפורמט קניין. אני יודע XML לא נשמע סקסי עבור מפתחים צעירים, אבל יש לו יתרון מדהים. ניתן לאמת קובץ נגד גרמניה. גרמניה כזו נקראת XSD, האקרונומיה של XML Schema Definition. עובדה מצחיקה: אתה כותב XSDs ב- XML. במאמר זה, אני מסביר את הבעיה, מה ניסיתי, ואת הפתרון הסופי עובד. הבעיה הדבר הטוב הוא כי האפליקציה כבר משתמשת XSD. עם זאת, בעת תחילת היישום, אימות XSD היה → הוספת מספר תכונות חשובות. בפרט, v1.1 מוסיף ו . גרסה 1.0 גרסה 1.1 טענות מגבלות זהות היו הערות רבות '//TODO validate' בקוד Java שלא ניתן ליישם ב- XSD 1.0 אבל יכול ב- XSD 1.1. הגישה הנאצית תחת הכובע, JDK משתמש ביישום Xerces מעוטר לתיקון. לצורך הכיף, בדוק את 'com.sun.org.apache.xerces.internal.jaxp' חבילה ב- JDKs המותקנים שלך. יישום זה תקוע באימות XSD 1.1. התחלתי להניח שה הוספתי את הגירסה העדכנית ביותר לביצוע שלי, ו... שום דבר. 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; } - תגית: Java תגית: Java אם אתה מבולבל כי תוכנית 1.1 תמיכה היא קבועה, ברוכים הבאים לעולם שלי. הפרויקט מכיל שני ענפים פוטנציאליים מעניינים, ו • The הקורס בענף הקודם נראה כך: יגאל 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 עדיין לא תומך 2 האם זה נראה מבטיח? תגית: Java תגית: Java חיפשתי ארכיטקט כזה זה לא מראה חפץ מוקדש. מרכזי Maven זה לא בא לי בראש באותו זמן, אבל בזמן כתיבת הפוסט, בדקתי: זה היה אומר לקבל את JAR, ליצור POM מטומטם, ולפרסם אותם על Artifactory הפנימי, אשר אין לי גישה לכתוב. Xerces הורדות חיפוש חלופות חיפשתי חלופות, אבל היחיד שמצאתי היה סאקסון. חבילת Saxon היא אוסף של כלים לעיבוד מסמכים XML.המרכיבים העיקריים הם: An XSLT processor, which can be used from the command line, or invoked from an application, using a supplied API. Saxon implements the XSLT 3.0 Recommendation. The product can also be used to run XSLT 2.0 stylesheets, or XSLT 1.0 stylesheets in backwards compatibility mode. An XPath processor accessible to applications via a supplied API. This supports XPath 2.0 and XPath 3.1. It can also be used in backwards-compatibility mode to evaluate XPath 1.0 expressions. 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 היא אוסף של כלים לעיבוד מסמכים XML.המרכיבים העיקריים הם: מעבד XSLT, שיכול לשמש מתוך שורת הפקודה, או להיקרא מתוך יישום, באמצעות API המוצע.Saxon מיישם את XSLT 3.0 Recommendation. מעבד XPath נגיש ליישומים באמצעות API המוצע.זה תומך ב- XPath 2.0 ו- XPath 3.1. מעבד XQuery שיכול לשמש מתוך שורת הפקודה, או להיקרא מתוך יישום באמצעות API המוצע.זה תומך XQuery 3.1, אשר גם מאפשר XQuery 1.0 או 3.0 שאילתות להתבצע.עם Saxon-EE, אתה יכול גם להשתמש את הרחבות XQuery מוגדרים ב XQuery Update 1.0 המלצה, אבל פרויקטים מאוחרים יותר של XQuery Update לא נתמכים (W3C הפסיק לעבוד על גירסאות אלה). XML Schema Processor זה תומך גם ב- XSD 1.0 וגם ב- XSD 1.1. זה יכול לשמש באופן עצמאי כדי לאמת תוכנית עבור הדיוק, או כדי לאמת מסמך מקור נגד ההגדרות של תוכנית. זה משמש גם כדי לתמוך בפונקציונליות מודעת לתוכנית של מעבדי XSLT ו- XQuery. כמו כלים אחרים, זה יכול להתבצע מתוך שורת הפקודה, או להתקשר מתוך יישום. מה זה סאקסון? מה זה סאקסון? לאחר שחקרתי קצת, מצאתי כי לסקס היו שני חסרונות עיקריים: למרות שניתן להשתמש ב- JAXP API רגיל, עליך לעבור ל- Saxon's proprietary API כדי לפתוח את כוחו המלא. Saxon מגיע בשני טעמים: Enterprise Edition הוא בתשלום, ואת Home Edition הוא בחינם. לא היה לי תקציב ולא היה לי זמן לרדוף אחריו. חזרה לכיכר 1 הגיע הזמן להעריך מחדש את המצב. בניית ממקור? לא אפשרי. סאקסון? תשלום. התקווה האחרונה שלי הייתה AI. אני חייב לומר כי פעם אחת, זה היה מציל חיים. מתברר כי שני בניינים של Xerces עם תכונות XSD 1.1 קיימים על הם פורסמו על ידי OpenGIS בשנת 2015-2016, בתקופה שבה היה די קל לפרסם שם. למעשה, הוא מציין מאיזה ענף הוא בא: . מרכזי Maven שלהם פומ http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/ בשלב זה, הייתי כמה שורות של קוד רחוק מהמטרה: 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); XSD 1.1 גרסה הגדרת התוכנית למפעל פרסינג SAX רגיל אני עדיין צריך לאמת כראוי שאין בעיה באבטחה מהבנייה "ירוקה" זו, אבל זה עובד: אני יכול לנצל תכונות מ- XSD 1.1! מסקנה במאמר זה, תיארתי את המסע שלי ליישם אימות XSD 1.1 ב-Java.זה הרבה פחות קל ממה שחשבתי בהתחלה, אבל אני מקווה שזה יעזור לאחרים שמתמודדים עם אותו מצב. כדי להמשיך הלאה: התוכנה Java API for XML Processing (JAXP) פרוייקט Apache XercesTM פורסם במקור באתר A Java Geek ג'ייק Java