সি # তে রেফারেন্সকৃত এক্সএসডি এর বিপরীতে একটি এক্সএমএল বৈধকরণ


161

আমার কাছে একটি নির্দিষ্ট স্কিমার অবস্থান সহ একটি এক্সএমএল ফাইল রয়েছে:

xsi:schemaLocation="someurl ..\localSchemaPath.xsd"

আমি সি # তে বৈধতা দিতে চাই। ভিজ্যুয়াল স্টুডিও, যখন আমি ফাইলটি খুলি, এটি স্কিমার বিপরীতে বৈধতা দেয় এবং ত্রুটিগুলি পুরোপুরি তালিকাবদ্ধ করে। যাইহোক, যদিও, এটির মতো যাচাই করার জন্য স্কিমাটি নির্দিষ্ট না করেই আমি সি # তে স্বয়ংক্রিয়ভাবে এটি প্রমাণীকরণ করতে পারি না:

XmlDocument asset = new XmlDocument();

XmlTextReader schemaReader = new XmlTextReader("relativeSchemaPath");
XmlSchema schema = XmlSchema.Read(schemaReader, SchemaValidationHandler);

asset.Schemas.Add(schema);

asset.Load(filename);
asset.Validate(DocumentValidationHandler);

এক্সএমএল ফাইলে স্বয়ংক্রিয়ভাবে উল্লিখিত স্কিমাটি দিয়ে আমি যাচাই করতে সক্ষম হব না? আমি কী মিস করছি?


1
: পড়ুন দুটিই MSDN নমুনা msdn.microsoft.com/en-us/library/...

উত্তর:


167

আপনাকে একটি এক্সএমএলআরডিটারসেটেটিং ইনস্ট্যান্স তৈরি করতে হবে এবং এটি তৈরি করার সময় এটি আপনার এক্সএমএলআরডারকে দিতে হবে। তারপরে ValidationEventHandlerবৈধতা ত্রুটিগুলি পেতে আপনি সেটিংসে সাবস্ক্রাইব করতে পারেন । আপনার কোডটি এর মতো দেখতে শেষ হবে:

using System.Xml;
using System.Xml.Schema;
using System.IO;

public class ValidXSD
{
    public static void Main()
    {

        // Set the validation settings.
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
        settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

        // Create the XmlReader object.
        XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);

        // Parse the file. 
        while (reader.Read()) ;

    }
    // Display any warnings or errors.
    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidation error: " + args.Message);

    }
}

4
+1 যদিও usingসম্পূর্ণতার জন্য ধারাটি ব্যবহার করতে আপডেট করা উচিত :)
আইএবস্ট্রট

55
আপনি যদি কোনও এক্সএসডি ফাইলের সাথে তুলনা করতে চান তবে উপরের কোডটিতে নিম্নলিখিত লাইনটি যুক্ত করুন: সেটিংস.শেমাস.এড ("আপনারডোমাইনইয়ার", "আপনার এক্সএসডিডি ফাইল। এক্সএসডি");
জেফ ফোল

5
Args.Exception.LineNumber ... ValidationCallBack মধ্যে: পাওয়ার জন্য লাইন # এবং অবস্থান ত্রুটির # কেবল ব্যবহার
user610064

1
আমার যে স্কিমাটির নামস্থান নেই তা যদি হয়?
ট্রি

1
ব্যবহার ল্যামডা , ভাল এই প্রোগ্রামটিতে, আরো স্বচ্ছতা কোড settings.ValidationEventHandler += (o, args) => { errors = true; // More code };
Kiquenet

107

একটি সহজ উপায়, যদি আপনি .NET 3.5 ব্যবহার করেন তবে হ'ল ব্যবহার XDocumentএবং XmlSchemaSetবৈধতা।

XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(schemaNamespace, schemaFileName);

XDocument doc = XDocument.Load(filename);
string msg = "";
doc.Validate(schemas, (o, e) => {
    msg += e.Message + Environment.NewLine;
});
Console.WriteLine(msg == "" ? "Document is valid" : "Document invalid: " + msg);

দেখুন MSDN ডকুমেন্টেশন আরো সহায়তার জন্য।


2
এই পদ্ধতিটির জন্য আপনাকে এক্সএমএল থেকে ইনলাইন স্কিমা না নেওয়ার আগেই স্কিমাটি আগে জানা উচিত।
লঙ্কাইমার্ট

এটি ঠিকঠাক কাজ করে তবে ত্রুটি ছুঁড়ে দেয় যখন এক্সএমএল ডকুমেন্টে <ক্যাটালগ> আমার <i> নতুন </ i> ক্যাটালগের মতো কিছু এইচটিএমএল ট্যাগ থাকে .... উপরের ক্ষেত্রে "<i>" এইচটিএমএল ট্যাগ যেমন একটি সমস্যা তৈরি করে এটি "<ক্যাটালগ>" এর মান ... এটি কীভাবে বৈধ করা যায়
অনিল পূর্সওয়ানি

6
@ অনিলপ্রসওয়ানি: আপনি যদি কোনও এক্সএমএল ডকুমেন্টে এইচটিএমএল স্থাপন করতে চান তবে আপনাকে এটি সিডিএটিএতে মোড়ানো দরকার। <catalog><![CDATA[my <i> new </i> catalog....]]></catalog>এটি করার সঠিক উপায়।
p0lar_bear

সরল ও মার্জিত! কোনও স্থির স্কিমা সেট (যা আমাদের ক্ষেত্রে এবং একাধিক ফোল্ডার এবং ফাইল সহ একটি বড়) এর বিরুদ্ধে বৈধতা দেওয়ার সময় এটি খুব ভাল কাজ করে। আমি ইতোমধ্যে XMLSchemaSet কে ভ্যালিডেটরের কলগুলির মধ্যে পুনরায় ব্যবহার করার জন্য ক্যাশে দেওয়ার বিষয়ে ভাবছি। অনেক ধন্যবাদ!
অ্যাডেল রেটামাল

20

নিম্নলিখিত উদাহরণটি একটি এক্সএমএল ফাইলকে বৈধতা দেয় এবং উপযুক্ত ত্রুটি বা সতর্কতা উত্পন্ন করে।

using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

public class Sample
{

    public static void Main()
    {
        //Load the XmlSchemaSet.
        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.Add("urn:bookstore-schema", "books.xsd");

        //Validate the file using the schema stored in the schema set.
        //Any elements belonging to the namespace "urn:cd-schema" generate
        //a warning because there is no schema matching that namespace.
        Validate("store.xml", schemaSet);
        Console.ReadLine();
    }

    private static void Validate(String filename, XmlSchemaSet schemaSet)
    {
        Console.WriteLine();
        Console.WriteLine("\r\nValidating XML file {0}...", filename.ToString());

        XmlSchema compiledSchema = null;

        foreach (XmlSchema schema in schemaSet.Schemas())
        {
            compiledSchema = schema;
        }

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.Schemas.Add(compiledSchema);
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
        settings.ValidationType = ValidationType.Schema;

        //Create the schema validating reader.
        XmlReader vreader = XmlReader.Create(filename, settings);

        while (vreader.Read()) { }

        //Close the reader.
        vreader.Close();
    }

    //Display any warnings or errors.
    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarning: Matching schema not found.  No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidation error: " + args.Message);

    }
}

পূর্ববর্তী উদাহরণটি নিম্নলিখিত ইনপুট ফাইলগুলি ব্যবহার করে।

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema" xmlns:cd="urn:cd-schema">
  <book genre="novel">
    <title>The Confidence Man</title>
    <price>11.99</price>
  </book>
  <cd:cd>
    <title>Americana</title>
    <cd:artist>Offspring</cd:artist>
    <price>16.95</price>
  </cd:cd>
</bookstore>

books.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

 <xsd:element name="bookstore" type="bookstoreType"/>

 <xsd:complexType name="bookstoreType">
  <xsd:sequence maxOccurs="unbounded">
   <xsd:element name="book"  type="bookType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="bookType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="authorName"/>
   <xsd:element name="price"  type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="genre" type="xsd:string"/>
 </xsd:complexType>

 <xsd:complexType name="authorName">
  <xsd:sequence>
   <xsd:element name="first-name"  type="xsd:string"/>
   <xsd:element name="last-name" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>

</xsd:schema>

18

ব্যক্তিগতভাবে আমি কলব্যাক ছাড়াই বৈধতা দেওয়ার পক্ষে:

public bool ValidateSchema(string xmlPath, string xsdPath)
{
    XmlDocument xml = new XmlDocument();
    xml.Load(xmlPath);

    xml.Schemas.Add(null, xsdPath);

    try
    {
        xml.Validate(null);
    }
    catch (XmlSchemaValidationException)
    {
        return false;
    }
    return true;
}

( সিঙ্ক্রোনাস এক্সএমএল স্কিমা বৈধকরণে টিমিজ0r এর পোস্টটি দেখুন ? নেট 3.5 )


9
আপনার এক্সএমএল কোন লাইনটি সঠিক নয় সে সম্পর্কে কলব্যাক আপনাকে কিছু অতিরিক্ত তথ্য সরবরাহ করে। এই পদ্ধতিটি খুব বাইনারি, হয় ডান হোক না ভুল :)
ফ্র্যাঙ্কিহলিউড

13

আমি ভিবিতে এই ধরণের স্বয়ংক্রিয় বৈধতা করেছি এবং এটি আমি এটি (সি # তে রূপান্তরিত) করেছি:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = settings.ValidationFlags |
                           Schema.XmlSchemaValidationFlags.ProcessSchemaLocation;
XmlReader XMLvalidator = XmlReader.Create(reader, settings);

তারপরে settings.ValidationEventHandlerফাইলটি পড়ার সময় আমি ইভেন্টটিতে সাবস্ক্রাইব করেছিলাম ।

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