दिलचस्प पोस्ट
मैं बीच में कैसे सेट कर सकता हूं? एनपीएम स्क्रिप्ट के लिए कमांड लाइन तर्क भेजना जब स्प्रिंग सिक्योरिटी का इस्तेमाल किया जाता है, तो बीन में मौजूदा यूज़रनेम (यानी सुरक्षा कंसोर्ट) की जानकारी प्राप्त करने का सही तरीका क्या है? ओरेकल एसक्यूएल में 2 तारीख / बार के बीच अंतर की गणना करें मैं एक DOM तत्व पर सभी घटनाओं को कैसे बाँट सकता हूं? गिट: "भ्रष्ट ढीले वस्तु" @ सेवा दो बार का निर्माण कर रहे हैं क्या किसी को ड्रैग एंड ड्रॉप, पुन: क्रम-योग्य सूची के निम्न स्तर (कोई फ्रेमवर्क) का पता नहीं है? पायथन लिंक की गई सूची आगे का उपयोग करने के फायदे एनएटी / सी # में प्रवेश के लिए बड़ी संख्या में रिकॉर्ड (बल्क डाट) लिखना लैम्ब्डा में समापन कैसे समझ सकता हूँ? SimpleDateFormat का उपयोग करने के लिए स्ट्रिंग को एक तिथि में कनवर्ट कैसे करें? फायरबेज उपयोगकर्ता टेबल पर अतिरिक्त विवरण जोड़ें मैं एंड्रॉइड के सिस्टम संस्करण को कैसे देख सकता हूं?

XSD फ़ाइल के विरुद्ध XML फ़ाइल को मान्य करने का सबसे अच्छा तरीका क्या है?

मैं कुछ एक्सएमएल फाइलों को उत्पन्न कर रहा हूं जो मुझे एक xsd फ़ाइल के अनुरूप करने की जरूरत थी जो मुझे दी गई थी वे पुष्टि करने का सबसे अच्छा तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "XSD फ़ाइल के विरुद्ध XML फ़ाइल को मान्य करने का सबसे अच्छा तरीका क्या है?"

जावा रनटाइम लायब्रेरी सत्यापन का समर्थन करती है। पिछली बार मैंने यह जाँच कर लिया था कि यह कवर के तहत अपाचे एक्सर्स पार्सर था। आपको शायद एक javax.xml.validation.Validator का उपयोग करना चाहिए

import javax.xml.XMLConstants; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.*; import java.net.URL; import org.xml.sax.SAXException; //import java.io.File; // if you use File import java.io.IOException; ... URL schemaFile = new URL("http://host:port/filename.xsd"); // webapp example xsd: // URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"); // local file example: // File schemaFile = new File("/location/to/localfile.xsd"); // etc. Source xmlFile = new StreamSource(new File("web.xml")); SchemaFactory schemaFactory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); try { Schema schema = schemaFactory.newSchema(schemaFile); Validator validator = schema.newValidator(); validator.validate(xmlFile); System.out.println(xmlFile.getSystemId() + " is valid"); } catch (SAXException e) { System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e); } catch (IOException e) {} 

स्कीमा फैक्ट्री स्थिर है स्ट्रिंग http://www.w3.org/2001/XMLSchema जो XSD को परिभाषित करता है। उपरोक्त कोड यूआरएल http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd खिलाफ एक युद्ध तैनाती डिस्क्रिप्टर की पुष्टि करता है लेकिन आप स्थानीय फ़ाइल के साथ आसानी से मान्य कर सकते हैं।

आपको दस्तावेज़ को मान्य करने के लिए DOMParser का उपयोग नहीं करना चाहिए (जब तक आपका लक्ष्य किसी दस्तावेज़ ऑब्जेक्ट मॉडल को बनाने के लिए नहीं है)। यह DOM ऑब्जेक्ट बनाना प्रारंभ करेगा क्योंकि यह दस्तावेज़ को पढ़ता है – यदि आप उनका उपयोग नहीं करने जा रहे हैं तो बेकार है।

यहां Xerces2 का उपयोग करने का तरीका बताया गया है इसके लिए एक ट्यूटोरियल, यहां (पुनः साइन अप करें)।

मूल एट्रिब्यूशन: यहाँ से स्पष्ट रूप से प्रतिलिपि बनाई गई है :

 import org.apache.xerces.parsers.DOMParser; import java.io.File; import org.w3c.dom.Document; public class SchemaTest { public static void main (String args[]) { File docFile = new File("memory.xml"); try { DOMParser parser = new DOMParser(); parser.setFeature("http://xml.org/sax/features/validation", true); parser.setProperty( "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", "memory.xsd"); ErrorChecker errors = new ErrorChecker(); parser.setErrorHandler(errors); parser.parse("memory.xml"); } catch (Exception e) { System.out.print("Problem parsing the file."); } } } 

हम चींटी का उपयोग करते हुए हमारी परियोजना का निर्माण करते हैं, इसलिए हम हमारी कॉन्फ़िग फाइलों की जांच करने के लिए schemavalidate कार्य का उपयोग कर सकते हैं:

 <schemavalidate> <fileset dir="${configdir}" includes="**/*.xml" /> </schemavalidate> 

अब शरारती कॉन्फ़िग फाइल हमारे बिल्ड को विफल कर देगी!

http://ant.apache.org/manual/Tasks/schemavalidate.html

मुझे इस साइट को उपयोगी भी पाया गया है

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html

यह एक है जो वास्तव में कम से कम उपद्रव के साथ मेरे लिए काम किया।

जावा 7 का उपयोग करके आप पैकेज विवरण में दिए गए दस्तावेजों का अनुसरण कर सकते हैं।

 // parse an XML document into a DOM tree DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = parser.parse(new File("instance.xml")); // create a SchemaFactory capable of understanding WXS schemas SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // load a WXS schema, represented by a Schema instance Source schemaFile = new StreamSource(new File("mySchema.xsd")); Schema schema = factory.newSchema(schemaFile); // create a Validator instance, which can be used to validate an instance document Validator validator = schema.newValidator(); // validate the DOM tree try { validator.validate(new DOMSource(document)); } catch (SAXException e) { // instance document is invalid! } 

चूंकि यह एक लोकप्रिय सवाल है, इसलिए मैं यह भी कहना चाहूंगा कि जावा "xsd" के संदर्भ में मान्य हो सकता है, उदाहरण के लिए यदि .xml फ़ाइल ही xsi:SchemaLocation निर्दिष्ट करती है, तो xsi:SchemaLocation या xsi:noNamespaceSchemaLocation (या xsi के लिए) विशेष नाम स्थान) के रूप में यहां बताया गया है :

 <document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd"> ... 

या स्कीमा स्थान (हमेशा एक्सएसडी मैपिंग के नामस्थान की सूची)

 <document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.example.com/document http://www.example.com/document.xsd"> ... 

"यदि आप यूआरएल, फाइल या स्रोत को निर्दिष्ट किए बिना एक स्कीमा बनाते हैं, तो जावा भाषा एक बनाता है जो दस्तावेज में दिखता है जिसे उसका उपयोग करना चाहिए स्कीमा ढूंढने के लिए। उदाहरण के लिए:"

 SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema schema = factory.newSchema(); 

और यह कई नामस्थानों के लिए काम करता है, आदि। इस दृष्टिकोण के साथ समस्या यह है कि xmlsns:xsi शायद एक नेटवर्क स्थान है, इसलिए यह प्रत्येक बाहर जाना होगा और हर सत्यापन के साथ नेटवर्क को हिट करेगा, हमेशा इष्टतम नहीं होगा

यहां एक उदाहरण है जो XML फाइल को किसी भी एक्सएसडी के संदर्भ में मान्य करता है, इसका संदर्भ (भले ही उन्हें नेटवर्क से खींच लिया गया हो):

  public static void verifyValidatesInternalXsd(String filename) throws Exception { InputStream xmlStream = new new FileInputStream(filename); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); factory.setNamespaceAware(true); factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(new RaiseOnErrorHandler()); builder.parse(new InputSource(xmlStream)); xmlStream.close(); } public static class RaiseOnErrorHandler implements ErrorHandler { public void warning(SAXParseException e) throws SAXException { throw new RuntimeException(e); } public void error(SAXParseException e) throws SAXException { throw new RuntimeException(e); } public void fatalError(SAXParseException e) throws SAXException { throw new RuntimeException(e); } } 

आप संदर्भित XSD को नेटवर्क से खींचने से बच सकते हैं, भले ही xml फाइलें यूआरएल के संदर्भ में, मैन्युअल रूप से एक्सएसडी निर्दिष्ट करें (कुछ अन्य उत्तर देखें) या "एक्सएमएल कैटलॉग" शैली रिज़ॉल्वर का उपयोग करके। वसंत स्पष्ट रूप से सत्यापन के लिए स्थानीय फाइलों की सेवा के लिए यूआरएल अनुरोधों को भी रोक सकता है । या आप setResourceResolver के जरिए अपना खुद का सेट कर सकते हैं, उदा:

 Source xmlFile = new StreamSource(xmlFileLocation); SchemaFactory schemaFactory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = schemaFactory.newSchema(); Validator validator = schema.newValidator(); validator.setResourceResolver(new LSResourceResolver() { @Override public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { InputSource is = new InputSource( getClass().getResourceAsStream( "some_local_file_in_the_jar.xsd")); // or lookup by URI, etc... return new Input(is); // for class Input see // https://stackoverflow.com/a/2342859/32453 } }); validator.validate(xmlFile); 

यहां एक और ट्यूटोरियल के लिए भी देखें।

एक और जवाब: क्योंकि आपने कहा था कि आपको फाइलें (लेखन) को मान्य करने की आवश्यकता है, आप लिखते समय सामग्री को मान्य करना चाह सकते हैं, पहले लिखने के बजाय, फिर सत्यापन के लिए वापस पढ़ना। यदि आप एसएक्स-आधारित लेखक का उपयोग करते हैं, तो आप संभवत: एक्सएमएल वैधीकरण के लिए जेडीके एपीआई के साथ ऐसा कर सकते हैं: यदि हां, तो 'वैल्यूडेटर.वालिडेट (स्रोत, परिणाम)' को कॉल करके वैधता में बस लिंक करें, जहां स्रोत आपके लेखक से आता है, और परिणाम है जहां उत्पादन जाना चाहिए।

वैकल्पिक रूप से यदि आप सामग्री (या एक पुस्तकालय जो स्टैक्स का उपयोग करता है या उपयोग कर सकते हैं) लिखने के लिए स्टैक्स का उपयोग करते हैं, तो वुडस्टॉक्स http://woodstox.codehaus.org XMLStreamWriter का उपयोग करते समय भी वैधता का समर्थन कर सकता है यह एक ब्लॉग एंट्री है जो दिखाता है कि यह कैसे किया जाता है:

यदि आप XML फ़ाइलों को प्रोग्रामैटिक रूप से जनरेट कर रहे हैं, तो आप XMLBeans लाइब्रेरी को देखना चाह सकते हैं। कमांड लाइन टूल का उपयोग करते हुए, XMLBeans स्वचालित रूप से एक XSD के आधार पर जावा ऑब्जेक्ट्स का एक सेट जनरेट करेंगे और संकुल करेगा। आप इन वस्तुओं का उपयोग इस स्कीमा के आधार पर एक XML दस्तावेज़ बनाने के लिए कर सकते हैं।

यह स्कीमा सत्यापन के लिए अंतर्निहित समर्थन प्रदान करता है, और जावा ऑब्जेक्ट को एक XML दस्तावेज़ में परिवर्तित कर सकता है और उप-विपरीत।

केस्टर और जेएएएसएबी अन्य जावा लाइब्रेरी हैं जो XMLBeans के समान उद्देश्य की सेवा करते हैं।

यदि आपके पास एक Linux- मशीन है तो आप निशुल्क कमांड लाइन टूल SAXCount का उपयोग कर सकते हैं। मैंने यह बहुत उपयोगी पाया।

 SAXCount -f -s -n my.xml 

यह dtd और xsd के खिलाफ पुष्टि करता है 50 एमबी फ़ाइल के लिए 5 एस

डेबियन निचोड़ में यह "libxerces-c-samples" पैकेज में स्थित है

Dtd की परिभाषा और xsd को xml में होना चाहिए! आप उन्हें अलग से कॉन्फ़िगर नहीं कर सकते

क्या आप एक उपकरण या पुस्तकालय की तलाश कर रहे हैं?

जहां तक ​​पुस्तकालय चला जाता है, बहुत ज्यादा डी-फ़ैक्टो मानक Xerces2 होता है जिसमें दोनों सी ++ और जावा संस्करण हैं।

सावधान रहें हालांकि हालांकि, यह एक भारी वजन समाधान है। लेकिन फिर, XSD फाइलों के विरुद्ध XML को मान्य करना एक भारी वजन समस्या है।

आपके लिए ऐसा करने के लिए उपकरण के रूप में, XMLFox एक सभ्य फ्रीवेयर समाधान लगता है, लेकिन इसे व्यक्तिगत रूप से उपयोग नहीं करने के लिए मैं निश्चित रूप से नहीं कह सकता

JAXB के साथ, आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

  @Test public void testCheckXmlIsValidAgainstSchema() { logger.info("Validating an XML file against the latest schema..."); MyValidationEventCollector vec = new MyValidationEventCollector(); validateXmlAgainstSchema(vec, inputXmlFileName, inputXmlSchemaName, inputXmlRootClass); assertThat(vec.getValidationErrors().isEmpty(), is(expectedValidationResult)); } private void validateXmlAgainstSchema(final MyValidationEventCollector vec, final String xmlFileName, final String xsdSchemaName, final Class<?> rootClass) { try (InputStream xmlFileIs = Thread.currentThread().getContextClassLoader().getResourceAsStream(xmlFileName);) { final JAXBContext jContext = JAXBContext.newInstance(rootClass); // Unmarshal the data from InputStream final Unmarshaller unmarshaller = jContext.createUnmarshaller(); final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); final InputStream schemaAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(xsdSchemaName); unmarshaller.setSchema(sf.newSchema(new StreamSource(schemaAsStream))); unmarshaller.setEventHandler(vec); unmarshaller.unmarshal(new StreamSource(xmlFileIs), rootClass).getValue(); // The Document class is the root object in the XML file you want to validate for (String validationError : vec.getValidationErrors()) { logger.trace(validationError); } } catch (final Exception e) { logger.error("The validation of the XML file " + xmlFileName + " failed: ", e); } } class MyValidationEventCollector implements ValidationEventHandler { private final List<String> validationErrors; public MyValidationEventCollector() { validationErrors = new ArrayList<>(); } public List<String> getValidationErrors() { return Collections.unmodifiableList(validationErrors); } @Override public boolean handleEvent(final ValidationEvent event) { String pattern = "line {0}, column {1}, error message {2}"; String errorMessage = MessageFormat.format(pattern, event.getLocator().getLineNumber(), event.getLocator().getColumnNumber(), event.getMessage()); if (event.getSeverity() == ValidationEvent.FATAL_ERROR) { validationErrors.add(errorMessage); } return true; // you collect the validation errors in a List and handle them later } } 

मुझे XSD के खिलाफ सिर्फ एक बार XML को मान्य करना पड़ा, इसलिए मैंने XMLFox की कोशिश की मुझे यह बहुत भ्रमित और अजीब है। सहायता निर्देश इंटरफ़ेस से मेल नहीं खाते।

मैं लिक्विक्स एक्सएमएल स्टूडियो 2008 (वी 6) का उपयोग कर रहा हूं जो उपयोग करने में अधिक आसान और अधिक तुरंत परिचित था (यूआई बहुत जल्दी Visual Basic 2008 एक्सप्रेस के समान है, जो मैं अक्सर उपयोग करता हूं)। दोष: सत्यापन क्षमता मुक्त संस्करण में नहीं है, इसलिए मुझे 30 दिन का परीक्षण का उपयोग करना पड़ा।