এক্সএসডি ফাইলের বিপরীতে কোনও এক্সএমএল ফাইল যাচাই করার সর্বোত্তম উপায় কী?


263

আমি কিছু এক্সএমএল ফাইল তৈরি করছি যা আমাকে দেওয়া একটি এক্সএসডি ফাইলের সাথে সঙ্গতিপূর্ণ হওয়া দরকার। তাদের অনুসারে যাচাই করার সর্বোত্তম উপায় কী?

উত্তর:


336

জাভা রানটাইম লাইব্রেরি বৈধতা সমর্থন করে। শেষবার আমি যাচাই করেছিলাম এটি কভারগুলির নীচে অ্যাপাচি জেরেস পার্সার ছিল। আপনার সম্ভবত একটি জাভ্যাক্স.এক্সএমএল.যুক্তি.ভিডিয়েটর ব্যবহার করা উচিত ।

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 ব্যবহার করা উচিত নয় (যদি না আপনার লক্ষ্য যে কোনও উপায়ে কোনও নথি অবজেক্ট মডেল তৈরি করা হয়)। এটি নথিকে পার্স করার সাথে সাথে এটি ডোম অবজেক্ট তৈরি করা শুরু করবে - যদি আপনি সেগুলি ব্যবহার না করেন তবে অপব্যয়।


আপনি কি এই উদাহরণে কোনও ডোম বা স্যাক্স পার্সার ব্যবহার করছেন? আমি কীভাবে বলতে পারি যে আপনি কোন পার্সার ব্যবহার করছেন তা আমি উল্লেখ করতে পারি না।
জিগি

1
@ জিগি - এটি জ্যাকসপি বাস্তবায়নের একটি বাস্তবায়ন বিশদ । সূর্যের জেডিকে 6 স্ট্রিমসোর্স সহ স্যাক্স পার্সার ব্যবহার করে । একটি JAXP বাস্তবায়ন এই ক্ষেত্রে আইনত একটি ডোম পার্সার ব্যবহার করতে পারে , তবে এর কোনও কারণ নেই। আপনি যদি বৈধতার জন্য স্পষ্টভাবে একটি ডিওএম পার্সার ব্যবহার করেন তবে আপনি অবশ্যই একটি ডিওএম ট্রি ইনস্ট্যান্ট করবেন।
ম্যাকডোয়েল

উপরের সাথে কীভাবে আমি একটি ত্রুটিহ্যান্ডলার ব্যবহার করব? কেবল ত্রুটিহ্যান্ডার তৈরি করার এবং এটি বৈধকারীর সাথে সংযুক্ত করার একটি মামলা? যেমন বৈধকরণকারক.সেটআরররহ্যান্ডলার () উদাহরণ হিসাবে যেমনটি এই প্রশ্নের মধ্যে প্রশ্নটি স্ট্যাকওভারফ্লো . com/ প্রশ্নস / 4864681/… ?
জিগি

Execptions করা উচিত নয় শুধু execptional পরিস্থিতিতে জন্য এবং ব্যবহার করা যেতে না নিয়ন্ত্রণ প্রবাহ জন্য?
মাইকে

এই কোডটি কেবল মারাত্মক ত্রুটিগুলিই ধরবে না? আপনি যদি অ-প্রাণঘাতী (যেমন অ-কাঠামোগত জাতীয়) ধরতে সক্ষম হতে চান তবে আমার মনে হয় আপনার একটি ত্রুটিহ্যান্ডলার ব্যবহার করা দরকার।
ম্যাট ফোরসিথে

25

এটি জার্সেস 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.");
     }
  }
}

9
স্যাক্স পার্সার আরও দক্ষ হবে - ডিওএম পার্সার ডোম অবজেক্ট তৈরি করে; এই দৃষ্টান্তে অপব্যয়মূলক ক্রিয়াকলাপ।
ম্যাকডোয়েল

প্রশ্নটি কোনও এক্সএসডি এর বিপরীতে কোনও এক্সএমএলকে বৈধতা দেওয়ার জন্য। এই উত্তরে আপনি আরও এগিয়ে যাচ্ছেন এবং পার্সার অবজেক্টটি পেয়ে যাচ্ছেন, যা প্রয়োজন নেই, তাই না?
ওয়েসলর

"ত্রুটিচেকার ক্যানর কোনও ধরণের সমাধান করা যায়" .. আমদানি অনুপস্থিত?
অ্যালেক্স

20

আমরা পিঁপড়া ব্যবহার করে আমাদের প্রকল্পটি তৈরি করি, তাই আমরা আমাদের কনফিগার ফাইলগুলি পরীক্ষা করতে স্কিমেডিয়ালিটি টাস্কটি ব্যবহার করতে পারি:

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

এখন দুষ্টু কনফিগারেশন ফাইলগুলি আমাদের বিল্ড ব্যর্থ হবে!

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


13

যেহেতু এই একটি জনপ্রিয় প্রশ্ন হল, আমি যে জাভা বাতলান করবেন বৈধকরণ বিরুদ্ধে 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বাইরেও এটি নির্ধারণ করছেন তা নিশ্চিত করুন তবে এর বাইরে, সম্ভবত নতুন প্রশ্ন খুলুন ...
রোজারডপ্যাক

6

জাভা 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!
}

2
"জাভা 7 ব্যবহার করা হচ্ছে .." এটি আসলে জাভা 5 এর অন্তর্ভুক্ত ছিল ।
অ্যান্ড্রু থম্পসন

4
এটি মূলত গৃহীত উত্তরের মতোই । এই সমাধান, একটি বিট অদক্ষ যদিও আমার মনে হচ্ছে যেমন অকারণে বিশ্লেষণ করতে XML এর জন্য করে DOM তৈরী করে: parser.parse(new File("instance.xml"))validatorএকটি গ্রহণ Source, তাই আপনি যা করতে পারেন: validator.validate(new StreamSource(new File("instance.xml")))
আলবার্তো

এইভাবে কাজ করে, একটি এসএক্সএক্সেপশন এক্সএমএল-ফাইলের প্রথম ত্রুটিতে নিক্ষেপ করা হবে এবং তারপরে বৈধতা থামিয়ে দেবে। তবে আমি সমস্ত (!) ত্রুটিগুলি জানতে চাই। আমি যদি এর পরিবর্তে ত্রুটিহ্যান্ডলার (নিজের শ্রেণি যা ত্রুটিহ্যান্ডলার প্রয়োগ করে) ব্যবহার করি তবে এটি সমস্ত ত্রুটি সনাক্ত করে, তবে বৈধতা প্রদানকারীদের চেষ্টা-আটকে রাখে valid বৈধতা কোনও ব্যতিক্রম ছুঁড়ে না .. শ্রেণিতে এমন একটি ত্রুটি কীভাবে সনাক্ত করব যা বৈধতার আবেদন করে? -আমার ভ্যালিডিটারের আদর্শ? আপনার সাহায্যের জন্য ধন্যবাদ!
mrbela

"ত্রুটি" (যেমন বৈধতা ত্রুটি) এবং "মারাত্মক ত্রুটি" (সু-গঠনের ত্রুটি) রয়েছে। একটি মারাত্মক ত্রুটি সাধারণত পার্সিং বন্ধ করে দেয়। তবে একটি বৈধতা ত্রুটি এটি থামায় না: আপনাকে স্পষ্টভাবে একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে। সুতরাং, ErrorHandlerযদি আপনার বৈধকরণের প্রয়োজন হয় তবে এটি সরবরাহ করা প্রয়োজন ।
লুডোভিক কিউটি

1
স্বীকার করতে হবে, স্বীকৃত উত্তরের চেয়ে কোডটি আরও পরিষ্কার দেখতে সহজ এবং সহজ দেখাচ্ছে।
ক্লকওয়ার্ক

3

আপনার যদি লিনাক্স-মেশিন থাকে তবে আপনি বিনামূল্যে কমান্ড-লাইন সরঞ্জাম SAXCount ব্যবহার করতে পারেন। আমি এটি খুব উপকারী পেয়েছি।

SAXCount -f -s -n my.xml

এটি ডিটিডি এবং এক্সএসডি এর বিরুদ্ধে বৈধতা দেয়। 50 এমবি ফাইলের জন্য 5 এস।

ডিবিয়ান স্কিজে এটি "libxerces-c-नमस्ते" প্যাকেজটিতে অবস্থিত।

ডিডিডি এবং এক্সএসডি এর সংজ্ঞাটি এক্সএমএলে থাকতে হবে! আপনি এগুলি আলাদাভাবে কনফিগার করতে পারবেন না।


2
এটি ভিএম (:! SAXCount -f -n -s%) থেকে সাধারণ এক্সএমএল বৈধতার জন্য অনুমতি দেয়
শেন

4
অথবা শ্রদ্ধেয় xmllint ব্যবহার করুন xmllint --schema phone.xsd phone.xml(13ren এর উত্তর থেকে)
রজারডপ্যাক

3

আরও একটি উত্তর: যেহেতু আপনি বলেছিলেন যে আপনি যে ফাইলগুলি তৈরি করছেন (লেখার) তা আপনাকে বৈধ করতে হবে, সুতরাং আপনি যখন লেখার সময় সামগ্রীটি বৈধ করতে চাইবেন, প্রথম লেখার পরিবর্তে, তারপরে যাচাইকরণের জন্য ফিরে। আপনি সম্ভবত এক্সএমএল বৈধতার জন্য জেডিকে এপিআই দিয়ে এটি করতে পারেন, আপনি যদি স্যাক্স-ভিত্তিক লেখক ব্যবহার করেন: যদি তাই হয় তবে কেবলমাত্র 'ভ্যালিডেটর.এলদিয়েট (উত্স, ফলাফল)' কল করে যাচকের সাথে লিঙ্ক করুন, যেখানে উত্সটি আপনার লেখক থেকে আসে এবং ফলাফলটি হয় যেখানে আউটপুট যেতে হবে।

বিকল্প হিসাবে যদি আপনি লিখিত সামগ্রী (বা একটি লাইব্রেরি যা স্ট্যাক্স ব্যবহার করতে পারে বা ব্যবহার করতে পারে) ব্যবহার করতে স্ট্যাক্স ব্যবহার করেন, এক্সএমএমস্ট্রিমউইটার ব্যবহার করার সময় উডস্টক্সও সরাসরি বৈধতা সমর্থন করতে পারে। কীভাবে এটি সম্পন্ন হয় তা দেখানোর জন্য এখানে একটি ব্লগ এন্ট্রি রয়েছে :


আরে স্ট্যাক্সম্যান, এমন কোনও এক্সএমএল স্ট্রিম রাইটার রয়েছে যা প্রিটি-প্রিন্ট ইনডেন্টিং করে? আমি অবাক হয়েছি যে এটি স্ট্যান্ডার্ড বাস্তবায়নে নেই। এছাড়াও, এটি কি খুব বেশি ব্যবহার হচ্ছে? আমি মনে করি এটি যাওয়ার সঠিক উপায় তবে এটিতে খুব কম আগ্রহ দেখায়।
13ren 8

: শুধু এখানে আপনার পোস্টের StaxMate সম্পর্কে (কিন্তু এটি একটি XMLStreamWriter নয়) পাওয়া stackoverflow.com/questions/290326/stax-xml-formatting-in-java/...
13ren

হ্যাঁ, স্ট্যাক্সমেট এটি করতে পারে। এটি লিখিত সামগ্রীর জন্য XMLStreamWriter অভ্যন্তরীণভাবে ব্যবহার করে, যাতে আপনি সেভাবেও বৈধতা রোধ করতে পারেন।
স্ট্যাকসমান

2

আপনি XML ফাইল জেনারেট করার হয় programatically, আপনি তাকান করতে পারেন XMLBeans গ্রন্থাগার। কমান্ড লাইন সরঞ্জামটি ব্যবহার করে, এক্সএমএল বিয়ানগুলি একটি এক্সএসডি এর উপর ভিত্তি করে জাভা অবজেক্টগুলির একটি সেট স্বয়ংক্রিয়ভাবে উত্পন্ন এবং প্যাকেজ করবে। তারপরে আপনি এই স্কিমার উপর ভিত্তি করে একটি এক্সএমএল ডকুমেন্ট তৈরি করতে এই বিষয়গুলি ব্যবহার করতে পারেন।

এটি স্কিমা বৈধতার জন্য অন্তর্নির্মিত সমর্থন করেছে এবং জাভা অবজেক্টগুলিকে এক্সএমএল ডকুমেন্টে এবং তদ্বিপরীত রূপান্তর করতে পারে।

ক্যাস্টর এবং জ্যাকএক্সবি অন্যান্য জাভা লাইব্রেরি যা এক্সএমএল বিনের অনুরূপ উদ্দেশ্যে পরিবেশন করে।


1

জ্যাকএক্সবি দিয়ে আপনি নীচের কোডটি ব্যবহার করতে পারেন:

    @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
    }
}

0

আপনি কি কোনও সরঞ্জাম বা লাইব্রেরি খুঁজছেন?

লাইব্রেরিগুলি যতদূর যায়, ডি-ফ্যাক্টো স্ট্যান্ডার্ডটি জেরেএস 2 যা সি ++ এবং জাভা উভয় সংস্করণ রয়েছে।

সতর্ক থাকুন যদিও, এটি একটি ভারী ওজন সমাধান। তবে আবার, এক্সএসডি ফাইলগুলির বিরুদ্ধে এক্সএমএলকে বৈধতা দেওয়া বরং ভারী ওজনের সমস্যা।

আপনার জন্য এটি করার একটি সরঞ্জাম হিসাবে, এক্সএমএলফক্স একটি শালীন ফ্রিওয়্যার সমাধান বলে মনে হচ্ছে, তবে ব্যক্তিগতভাবে এটি ব্যবহার না করে আমি নিশ্চিতভাবে বলতে পারি না।


0

অনলাইন স্কিমার বিরুদ্ধে বৈধতা দিন

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);

স্থানীয় স্কিমার বিরুদ্ধে বৈধতা দিন

জাভা সহ অফলাইন XML বৈধকরণ ation


0

উডস্টক্স ব্যবহার করে , আপনার স্কিমার বিরুদ্ধে বৈধতা পেতে এবং এক্সএমএল বিশ্লেষণের জন্য স্টাক্স পার্সারটি কনফিগার করুন।

যদি ব্যতিক্রমগুলি ধরা হয় তবে এক্সএমএল বৈধ নয়, অন্যথায় এটি বৈধ:

// 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অর্ডার কর্মক্ষমতা পূর্ণবিস্তার হবে।


-3

XSD এর বিপরীতে আমাকে একটি এক্সএমএলকে বৈধতা দিতে হয়েছিল, তাই আমি এক্সএমএলফক্স চেষ্টা করেছিলাম। আমি এটি খুব বিভ্রান্তিকর এবং অদ্ভুত বলে মনে করেছি। সহায়তা নির্দেশাবলী ইন্টারফেসের সাথে মেলে না বলে মনে হয়।

আমি লিকুইডএক্সএমএল স্টুডিও 2008 (ভি 6) ব্যবহার করে শেষ করেছি যা ব্যবহার করা অনেক সহজ ছিল এবং তাত্ক্ষণিকভাবে পরিচিত (ইউআই ভিজুয়াল বেসিক 2008 এক্সপ্রেসের সাথে খুব মিল, যা আমি প্রায়শই ব্যবহার করি)। অপূর্ণতা: যাচাইকরণের ক্ষমতাটি মুক্ত সংস্করণে নেই, তাই আমাকে 30 দিনের ট্রায়াল ব্যবহার করতে হয়েছিল।


1
প্রশ্নটি জাভা, কিন্তু এই উত্তরটি নয়। :-(
james.garriss

পরিষ্কার কথা বলতে গেলে, "জাভা" শব্দটি কখনই প্রশ্নে আসে না, কেবল ট্যাগগুলি। আমি তার জন্য প্রশ্নটি ডিং করব, উত্তরটি নয়।
মার্ক স্টোর

ধন্যবাদ জেমস এবং মার্ক, আমাকে তীক্ষ্ণতর করতে সহায়তা করুন!
নোম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.