উত্তর:
জাভা রানটাইম লাইব্রেরি বৈধতা সমর্থন করে। শেষবার আমি যাচাই করেছিলাম এটি কভারগুলির নীচে অ্যাপাচি জেরেস পার্সার ছিল। আপনার সম্ভবত একটি জাভ্যাক্স.এক্সএমএল.যুক্তি.ভিডিয়েটর ব্যবহার করা উচিত ।
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
যা এক্সএসডি সংজ্ঞায়িত করে। উপরের কোডটি ইউআরএল-এর বিপরীতে একটি ওয়ার ওয়্যার ডিপ্লোমেন্ট বর্ণনাকারীকে বৈধ করেhttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
তবে আপনি কোনও স্থানীয় ফাইলের বিপরীতে খুব সহজেই বৈধতা দিতে পারেন।
কোনও ডকুমেন্ট যাচাই করার জন্য আপনার DOMParser ব্যবহার করা উচিত নয় (যদি না আপনার লক্ষ্য যে কোনও উপায়ে কোনও নথি অবজেক্ট মডেল তৈরি করা হয়)। এটি নথিকে পার্স করার সাথে সাথে এটি ডোম অবজেক্ট তৈরি করা শুরু করবে - যদি আপনি সেগুলি ব্যবহার না করেন তবে অপব্যয়।
এটি জার্সেস 2 ব্যবহার করে কীভাবে করবেন তা এখানে । এর জন্য একটি টিউটোরিয়াল, এখানে (পুনরায় সাইনআপ)।
আসল অ্যাট্রিবিউশন: এখান থেকে স্পষ্টভাবে অনুলিপি করা হয়েছে :
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>
<fileset dir="${configdir}" includes="**/*.xml" />
</schemavalidate>
এখন দুষ্টু কনফিগারেশন ফাইলগুলি আমাদের বিল্ড ব্যর্থ হবে!
যেহেতু এই একটি জনপ্রিয় প্রশ্ন হল, আমি যে জাভা বাতলান করবেন বৈধকরণ বিরুদ্ধে xsd এর "উল্লেখ করা" করতে পারেন, উদাহরণস্বরূপ যদি .xml ফাইল নিজেই XSD এর নির্দিষ্ট করে হেডারের মধ্যে ব্যবহার 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/my_namespace http://www.example.com/document.xsd">
...
অন্য উত্তরগুলি এখানেও কাজ করে, কারণ .xML ফাইলগুলিতে .xML ফাইলটিতে ঘোষিত নেমস্পেসের "মানচিত্র" ফাইলগুলি, কারণ তারা একটি নেমস্পেস ঘোষণা করে এবং যদি .xML ফাইলে নামের জায়গার সাথে মিলে যায় তবে আপনি ভাল। তবে কখনও কখনও এটি একটি কাস্টম রিসলভার রাখতে সক্ষম হতে সুবিধাজনক ...
জাভাডোকস থেকে: "আপনি যদি কোনও ইউআরএল, ফাইল বা উত্স উল্লেখ না করে স্কিমা তৈরি করেন তবে জাভা ভাষা এমন একটি তৈরি করে যা ডকুমেন্টটিতে তার ব্যবহার করা উচিত স্কিমার সন্ধানের জন্য যাচাই করা হচ্ছে looks উদাহরণস্বরূপ:"
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
এবং এটি একাধিক নেমস্পেস ইত্যাদির জন্য কাজ করে this এই পদ্ধতির সমস্যাটি xmlsns:xsi
হ'ল সম্ভবত একটি নেটওয়ার্ক অবস্থান, সুতরাং এটি ডিফল্টরূপে বাইরে চলে যায় এবং সর্বদা অনুকূল নয়, প্রতিটি এবং প্রতিটি বৈধতা দিয়ে নেটওয়ার্কটিকে আঘাত করে।
এখানে একটি উদাহরণ যা কোনও এক্সএসডি এর রেফারেন্সের বিরুদ্ধে কোনও এক্সএমএল ফাইলকে বৈধতা দেয় (এটি নেটওয়ার্ক থেকে তাদের টানতে হবে এমনকি যদি):
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 ম্যানুয়ালি নির্দিষ্ট করে (এখানে কিছু অন্যান্য উত্তর দেখুন) বা "এক্সএমএল ক্যাটালগ" স্টাইল রেজোলভার ব্যবহার করে নেটওয়ার্ক থেকে রেফারেন্সেড এক্সএসডি গুলি এড়াতে পারবেন না । স্প্রিং স্পষ্টতই বৈধতার জন্য স্থানীয় ফাইলগুলি সরবরাহ করার জন্য ইউআরএল অনুরোধগুলিকে বাধা দিতে পারে। অথবা আপনি সেট রিসোর্স রিসোলভারের মাধ্যমে নিজের সেট করতে পারেন , প্রাক্তন:
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);
অন্য টিউটোরিয়াল জন্য এখানে দেখুন ।
আমি বিশ্বাস করি ডিফল্টটি ডোম পার্সিং ব্যবহার করা হয়, আপনি SAX পার্সারের সাথেও অনুরূপ কিছু করতে পারেন যা বৈধতা যাচাই করছে saxReader.setEntityResolver(your_resolver_here);
setResourceResolver
বাইরেও এটি নির্ধারণ করছেন তা নিশ্চিত করুন তবে এর বাইরে, সম্ভবত নতুন প্রশ্ন খুলুন ...
জাভা 7 ব্যবহার করে আপনি প্যাকেজ বিবরণে প্রদত্ত ডকুমেন্টেশনগুলি অনুসরণ করতে পারেন ।
// 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 StreamSource(new File("instance.xml")); } catch (SAXException e) { // instance document is invalid! }
parser.parse(new File("instance.xml"))
। validator
একটি গ্রহণ Source
, তাই আপনি যা করতে পারেন: validator.validate(new StreamSource(new File("instance.xml")))
।
ErrorHandler
যদি আপনার বৈধকরণের প্রয়োজন হয় তবে এটি সরবরাহ করা প্রয়োজন ।
আপনার যদি লিনাক্স-মেশিন থাকে তবে আপনি বিনামূল্যে কমান্ড-লাইন সরঞ্জাম SAXCount ব্যবহার করতে পারেন। আমি এটি খুব উপকারী পেয়েছি।
SAXCount -f -s -n my.xml
এটি ডিটিডি এবং এক্সএসডি এর বিরুদ্ধে বৈধতা দেয়। 50 এমবি ফাইলের জন্য 5 এস।
ডিবিয়ান স্কিজে এটি "libxerces-c-नमस्ते" প্যাকেজটিতে অবস্থিত।
ডিডিডি এবং এক্সএসডি এর সংজ্ঞাটি এক্সএমএলে থাকতে হবে! আপনি এগুলি আলাদাভাবে কনফিগার করতে পারবেন না।
xmllint --schema phone.xsd phone.xml
(13ren এর উত্তর থেকে)
আরও একটি উত্তর: যেহেতু আপনি বলেছিলেন যে আপনি যে ফাইলগুলি তৈরি করছেন (লেখার) তা আপনাকে বৈধ করতে হবে, সুতরাং আপনি যখন লেখার সময় সামগ্রীটি বৈধ করতে চাইবেন, প্রথম লেখার পরিবর্তে, তারপরে যাচাইকরণের জন্য ফিরে। আপনি সম্ভবত এক্সএমএল বৈধতার জন্য জেডিকে এপিআই দিয়ে এটি করতে পারেন, আপনি যদি স্যাক্স-ভিত্তিক লেখক ব্যবহার করেন: যদি তাই হয় তবে কেবলমাত্র 'ভ্যালিডেটর.এলদিয়েট (উত্স, ফলাফল)' কল করে যাচকের সাথে লিঙ্ক করুন, যেখানে উত্সটি আপনার লেখক থেকে আসে এবং ফলাফলটি হয় যেখানে আউটপুট যেতে হবে।
বিকল্প হিসাবে যদি আপনি লিখিত সামগ্রী (বা একটি লাইব্রেরি যা স্ট্যাক্স ব্যবহার করতে পারে বা ব্যবহার করতে পারে) ব্যবহার করতে স্ট্যাক্স ব্যবহার করেন, এক্সএমএমস্ট্রিমউইটার ব্যবহার করার সময় উডস্টক্সও সরাসরি বৈধতা সমর্থন করতে পারে। কীভাবে এটি সম্পন্ন হয় তা দেখানোর জন্য এখানে একটি ব্লগ এন্ট্রি রয়েছে :
আপনি XML ফাইল জেনারেট করার হয় programatically, আপনি তাকান করতে পারেন XMLBeans গ্রন্থাগার। কমান্ড লাইন সরঞ্জামটি ব্যবহার করে, এক্সএমএল বিয়ানগুলি একটি এক্সএসডি এর উপর ভিত্তি করে জাভা অবজেক্টগুলির একটি সেট স্বয়ংক্রিয়ভাবে উত্পন্ন এবং প্যাকেজ করবে। তারপরে আপনি এই স্কিমার উপর ভিত্তি করে একটি এক্সএমএল ডকুমেন্ট তৈরি করতে এই বিষয়গুলি ব্যবহার করতে পারেন।
এটি স্কিমা বৈধতার জন্য অন্তর্নির্মিত সমর্থন করেছে এবং জাভা অবজেক্টগুলিকে এক্সএমএল ডকুমেন্টে এবং তদ্বিপরীত রূপান্তর করতে পারে।
ক্যাস্টর এবং জ্যাকএক্সবি অন্যান্য জাভা লাইব্রেরি যা এক্সএমএল বিনের অনুরূপ উদ্দেশ্যে পরিবেশন করে।
জ্যাকএক্সবি দিয়ে আপনি নীচের কোডটি ব্যবহার করতে পারেন:
@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
}
}
আপনি কি কোনও সরঞ্জাম বা লাইব্রেরি খুঁজছেন?
লাইব্রেরিগুলি যতদূর যায়, ডি-ফ্যাক্টো স্ট্যান্ডার্ডটি জেরেএস 2 যা সি ++ এবং জাভা উভয় সংস্করণ রয়েছে।
সতর্ক থাকুন যদিও, এটি একটি ভারী ওজন সমাধান। তবে আবার, এক্সএসডি ফাইলগুলির বিরুদ্ধে এক্সএমএলকে বৈধতা দেওয়া বরং ভারী ওজনের সমস্যা।
আপনার জন্য এটি করার একটি সরঞ্জাম হিসাবে, এক্সএমএলফক্স একটি শালীন ফ্রিওয়্যার সমাধান বলে মনে হচ্ছে, তবে ব্যক্তিগতভাবে এটি ব্যবহার না করে আমি নিশ্চিতভাবে বলতে পারি না।
অনলাইন স্কিমার বিরুদ্ধে বৈধতা দিন
Source xmlFile = new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream("your.xml"));
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(Thread.currentThread().getContextClassLoader().getResource("your.xsd"));
Validator validator = schema.newValidator();
validator.validate(xmlFile);
স্থানীয় স্কিমার বিরুদ্ধে বৈধতা দিন
উডস্টক্স ব্যবহার করে , আপনার স্কিমার বিরুদ্ধে বৈধতা পেতে এবং এক্সএমএল বিশ্লেষণের জন্য স্টাক্স পার্সারটি কনফিগার করুন।
যদি ব্যতিক্রমগুলি ধরা হয় তবে এক্সএমএল বৈধ নয়, অন্যথায় এটি বৈধ:
// create the XSD schema from your schema file
XMLValidationSchemaFactory schemaFactory = XMLValidationSchemaFactory.newInstance(XMLValidationSchema.SCHEMA_ID_W3C_SCHEMA);
XMLValidationSchema validationSchema = schemaFactory.createSchema(schemaInputStream);
// create the XML reader for your XML file
WstxInputFactory inputFactory = new WstxInputFactory();
XMLStreamReader2 xmlReader = (XMLStreamReader2) inputFactory.createXMLStreamReader(xmlInputStream);
try {
// configure the reader to validate against the schema
xmlReader.validateAgainst(validationSchema);
// parse the XML
while (xmlReader.hasNext()) {
xmlReader.next();
}
// no exceptions, the XML is valid
} catch (XMLStreamException e) {
// exceptions, the XML is not valid
} finally {
xmlReader.close();
}
নোট : আপনি একাধিক ফাইল যাচাই করার প্রয়োজন হলে, আপনি আপনার পুনরায় ব্যবহার করার জন্য চেষ্টা করা উচিত XMLInputFactory
এবং XMLValidationSchema
অর্ডার কর্মক্ষমতা পূর্ণবিস্তার হবে।
XSD এর বিপরীতে আমাকে একটি এক্সএমএলকে বৈধতা দিতে হয়েছিল, তাই আমি এক্সএমএলফক্স চেষ্টা করেছিলাম। আমি এটি খুব বিভ্রান্তিকর এবং অদ্ভুত বলে মনে করেছি। সহায়তা নির্দেশাবলী ইন্টারফেসের সাথে মেলে না বলে মনে হয়।
আমি লিকুইডএক্সএমএল স্টুডিও 2008 (ভি 6) ব্যবহার করে শেষ করেছি যা ব্যবহার করা অনেক সহজ ছিল এবং তাত্ক্ষণিকভাবে পরিচিত (ইউআই ভিজুয়াল বেসিক 2008 এক্সপ্রেসের সাথে খুব মিল, যা আমি প্রায়শই ব্যবহার করি)। অপূর্ণতা: যাচাইকরণের ক্ষমতাটি মুক্ত সংস্করণে নেই, তাই আমাকে 30 দিনের ট্রায়াল ব্যবহার করতে হয়েছিল।