2009-06-03 16 views
7

साथ मैं XSD साथ एक्सएमएल मान्य वास्तविक कठिनाइयों में चल रहा हूँ। मैं आगे इस और राज्य के सभी उपसर्ग चाहिए, मैं XSD और सत्यापन के लिए नए हूँ, इसलिए मुझे यकीन है कि अगर यह एक कोड मुद्दा या एक एक्सएमएल मुद्दा है नहीं कर रहा हूँ। मैं XML API नरक में किया गया है और bajillion विभिन्न विकल्पों के साथ वापस और लगता है कि मैं पाया है कि क्या XSD के साथ एक्सएमएल मान्य के लिए आदर्श रणनीति होगी गए हैं। ध्यान दें, मेरी एक्सएमएल और XSD एक डेटाबेस से आ रहे हैं, इसलिए मैं डिस्क से कुछ भी पढ़ने की जरूरत नहीं है।सत्यापित किया जा रहा एक्सएमएल XSD

मैं एक साधारण नमूना Windows Forms आवेदन में मेरी समस्या को संकुचित होता है। यह XSD (txtXsd) के लिए एक पाठ बॉक्स, एक्सएमएल (txtXml) के लिए एक पाठ बॉक्स, परिणाम (txtResult) के लिए एक पाठ बॉक्स, और एक बटन सत्यापन शुरू करने के लिए (btnValidate) है।

मैं Microsoft से एक नमूना XSD फ़ाइल का उपयोग कर रहा हूँ,

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:bookstore-schema" elementFormDefault="qualified" targetNamespace="urn:bookstore-schema"> 
    <xsd:element name="title" type="xsd:string" /> 
    <xsd:element name="comment" type="xsd:string" /> 
    <xsd:element name="author" type="authorName"/> 
    <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> 

मैं अपने आवेदन में निम्नलिखित कोड का उपयोग कर रहा हूँ।

private void btnValidate_Click (object sender, EventArgs e) 
{ 
    try 
    { 
     XmlTextReader reader = new XmlTextReader(txtXsd.Text, XmlNodeType.Document, new XmlParserContext(null, null, String.Empty, XmlSpace.None)); 
     XmlSchema schema = XmlSchema.Read(reader, null); 
     XmlSchemaSet schemas = new XmlSchemaSet(); 
     schemas.Add(schema); 

     XDocument doc = XDocument.Parse(txtXml.Text); 
     doc.Validate(schemas, ValidateSchema); 
    } 
    catch (Exception exception) 
    { 
     txtResult.Text += exception.Message + Environment.NewLine; 
    } 
} 

private void ValidateSchema (Object sender, ValidationEventArgs e) 
{ 
    txtResult.Text += e.Message + Environment.NewLine; 
} 

एक परीक्षण के रूप में, मैंने वैध एक्सएमएल रखा है, लेकिन मुझे लगता है कि ऊपर एक्सएसडी के अनुरूप नहीं होना चाहिए।

<xml> 
    <bogusNode>blah</bogusNode> 
</xml> 

परिणाम कुछ भी नहीं है, कोई सत्यापन त्रुटियां नहीं हैं। मैं इसे कैसे ठीक करूं?

उत्तर

4

ठीक है, एक के लिए - आपका एक्सएसडी एक एक्सएमएल नेमस्पेस xmlns="urn:bookstore-schema" परिभाषित करता है जो आपकी एक्सएमएल टेस्ट फ़ाइल में मौजूद नहीं है - इसलिए, आपकी एक्सएमएल टेस्ट फ़ाइल में कुछ भी मान्य नहीं होगा।

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <xsd:element name="title" type="xsd:string" /> 

तो यह ठीक से अपने XML परीक्षण फ़ाइल को मान्य और गलत तत्वों के बारे में शिकायत करेंगे:

आप उन तत्वों को निकाल देते हैं अपने स्कीमा के रूप में।

<xml> नामक तत्व का भी उपयोग करना एक अच्छा विचार नहीं हो सकता है - क्योंकि निर्देश <?xml ......?> एक पूर्व परिभाषित निर्देश है और आपके दस्तावेज़ में कहीं और टैग नाम के रूप में नहीं दिखना चाहिए।

मार्क

+0

मुझे एक झुकाव संदेह था कि क्या चल रहा था। एक एक्सएमएल किताब पिकअप करने जा रहे हैं। –

+1

बड़ी तस्वीर में, मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि xml सबमिट xsd के अनुरूप है। क्या वे एक ही नेमस्पेस में नहीं हैं तो सत्यापित करने का कोई तरीका है? क्या मुझे वास्तव में दोनों नामस्थानों को देख कर कोड में ऐसा करना है? –

+0

यहोशू: एक्सएमएल जिसे आप मान्य कर रहे हैं वह एक्सएसडी परिभाषित होने के समान नामस्थान होना चाहिए। एक्सएमएल नेमस्पेस का यह पूरा बिंदु है - आम तौर पर इस्तेमाल किए जा सकने वाले पहचानकर्ताओं/टैग्स को रखने में सक्षम होना (जैसे '

') उन्हें अपने नामस्थान (जैसे .NET नेमस्पेस) में डालकर। –

1

तुम भी XML सत्यापन

+2

के लिए एक स्कीमा जहां तक ​​मुझे पता है, XmlValidatingReader .NET 2.0 के साथ बहिष्कृत है और अब इसका उपयोग नहीं किया जाना चाहिए। एमएसडीएन कहता है: "XmlValidatingReader क्लास माइक्रोसॉफ्ट .NET Framework संस्करण 2.0 में अप्रचलित है। आप XmlReaderSettings क्लास और बनाएँ विधि का उपयोग कर एक मान्य XmlReader इंस्टेंस बना सकते हैं। अधिक जानकारी के लिए, XML डेटा को XmlReader के साथ मान्य करना देखें।" –

2

के लिए XmlValidatingReader कोशिश कर सकते हैं मैं उपयोगकर्ता एक्सएमएल कि XSD में परिभाषित नहीं है प्रस्तुत करने के लिए नहीं करना चाहती।

आपको परवाह क्यों है? आपकी स्कीमा आपके नामस्थान में मौजूद XML नोड्स को मान्य करती है। आपका प्रोसेसिंग तर्क आपके नामस्थान में मौजूद XML नोड्स को संसाधित करता है। आपके नामस्थान में नहीं होने वाले नोड्स आपकी स्कीमा या आपके तर्क से प्रासंगिक नहीं हैं।

यदि XML दस्तावेज़ में सभी नोड्स को किसी विशिष्ट नेमस्पेस पर प्रतिबंधित करना वास्तव में आवश्यक है, तो आप मूल XmlReader को 0xप्राप्त करने वाले तर्क को सत्यापित करके पूरा कर सकते हैं।

public static void Main() 
    { 
     const string myNamespaceURN = "urn:my-namespace"; 

     XmlSchemaSet sc = new XmlSchemaSet(); 
     sc.Add(myNamespaceURN, "mySchema.xsd"); 

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

     XmlReader reader = XmlReader.Create("myDocument.xml", settings); 

     while (reader.Read()) 
     { 
      if ((reader.NodeType == XmlNodeType.Element || 
       reader.NodeType == XmlNodeType.Attribute) 
       && 
       reader.NamespaceURI != myNamespaceURN) 
      { 
       LogError(reader.NamespaceURI + " is not a valid namespace."); 
      } 
     } 
    } 

    private static void ValidationCallBack(object sender, ValidationEventArgs e) 
    { 
     LogError(e.Message); 
    } 

    private static void LogError(string msg) 
    { 
     Console.WriteLine(msg); 
    } 
+0

लिंक मर चुका है – Jowen

संबंधित मुद्दे