2008-09-22 19 views
5

मेरे पास कुछ डब्ल्यूसीएफ विधियां हैं जिनका उपयोग सर्वर अनुप्रयोग से जानकारी को बाइंडिंग में उपयोग के लिए वेबसाइट फ्रंटेंड पर प्रेषित करने के लिए किया जाता है। मैं परिणाम को XElement के रूप में भेज रहा हूं जो एक एक्सएमएल पेड़ की जड़ है जिसमें डेटा है जिसके खिलाफ मैं बांधना चाहता हूं।किसी विधि से एक्सएमएल की वैधता का परीक्षण कैसे करें?

मैं कुछ परीक्षण करना चाहता हूं जो डेटा की जांच करें और सुनिश्चित करें कि यह अपेक्षा के अनुसार आता है।

मेरी वर्तमान सोच यह है: XElement पेड़ को लौटने वाली प्रत्येक विधि में एक संबंधित स्कीमा (.XSD) फ़ाइल होती है। यह फ़ाइल असेंबली के भीतर शामिल है जिसमें मेरे डब्ल्यूसीएफ कक्षाएं एक एम्बेडेड संसाधन के रूप में शामिल हैं।

टेस्ट इन विधियों पर विधि को कॉल करते हैं और इन एम्बेडेड स्कीमा के खिलाफ परिणाम की तुलना करते हैं।

क्या यह एक अच्छा विचार है? यदि नहीं, तो मैं किस प्रकार के एक्सएमएल की एक विधि वापस लौटाएगा "गारंटी" प्रदान करने के लिए मैं अन्य तरीकों का उपयोग कैसे कर सकता हूं?

यदि यह है, तो आप एक स्कीमा के खिलाफ XElement को कैसे सत्यापित करते हैं? और मैं उस स्कीमा को उस असेंबली से कैसे प्राप्त कर सकता हूं जिसमें यह एम्बेड किया गया है?

उत्तर

11

आईडी कहते हैं कि xsd स्कीमा के साथ xml मान्य करना एक अच्छा विचार है।

लोड स्कीमा के साथ XElement को कैसे सत्यापित करें: जैसा कि आप इस उदाहरण में देखते हैं, आपको "पोस्ट-स्कीमा-सत्यापन इंफोसेट" को पॉप्युलेट करने के लिए पहले XDocument को सत्यापित करने की आवश्यकता है (इसके बिना ऐसा करने का समाधान हो सकता है अभी तक एक को खोजने के लिए) XDOcument लेकिन इम पर मान्य विधि का उपयोग कर:

String xsd = 
@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'> 
    <xsd:element name='root'> 
    <xsd:complexType> 
    <xsd:sequence> 
     <xsd:element name='child1' minOccurs='1' maxOccurs='1'> 
     <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name='grandchild1' minOccurs='1' maxOccurs='1'/> 
     <xsd:element name='grandchild2' minOccurs='1' maxOccurs='2'/> 
     </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
    </xsd:schema>"; 
String xml = @"<?xml version='1.0'?> 
<root> 
    <child1> 
     <grandchild1>alpha</grandchild1> 
     <grandchild2>beta</grandchild2> 
    </child1> 
</root>"; 
XmlSchemaSet schemas = new XmlSchemaSet(); 
schemas.Add("", XmlReader.Create(new StringReader(xsd))); 
XDocument doc = XDocument.Load(XmlReader.Create(new StringReader(xml))); 
Boolean errors = false; 
doc.Validate(schemas, (sender, e) => 
{ 
    Console.WriteLine(e.Message); 
    errors = true; 
}, true); 
errors = false; 
XElement child = doc.Element("root").Element("child1"); 
child.Validate(child.GetSchemaInfo().SchemaElement, schemas, (sender, e) => 
{ 
    Console.WriteLine(e.Message); 
    errors = true; 
}); 

कैसे एक विधानसभा से एम्बेडेड स्कीमा पढ़ सकते हैं और XmlSchemaSet में जोड़ने के लिए:

Assembly assembly = Assembly.GetExecutingAssembly(); 
// you can use reflector to get the full namespace of your embedded resource here 
Stream stream = assembly.GetManifestResourceStream("AssemblyRootNamespace.Resources.XMLSchema.xsd"); 
XmlSchemaSet schemas = new XmlSchemaSet(); 
schemas.Add(null, XmlReader.Create(stream)); 
+0

element.GetSchemaInfo() अशक्त देता है। – Will

+0

मेरे पास XDocument पर मान्य विधि नहीं है, यह नामस्थान से एक विस्तार विधि है? –

+1

जो भी नाम स्थान की तलाश में है: System.Xml.Schema का उपयोग कर; –

4

आप अगर ' फिर से कुछ हल्के वजन वाले काम और एक्सएसडी बहुत अधिक हैं, संभवतः अपने एक्सएमएल डेटा को दृढ़ता से टाइप करने पर भी विचार करें। उदाहरण के लिए, मेरे पास XElement से प्राप्त होने वाली प्रोजेक्ट में कई कक्षाएं हैं। एक ExceptionXElement है, दूसरा HttpHeaderXElement है, आदि। उनमें, मैं XElement से प्राप्त करता हूं और पार्स और TryParse विधियों को जोड़ता हूं जो एक उदाहरण बनाने के लिए XML डेटा वाले स्ट्रिंग लेते हैं। यदि TryParse() गलत लौटाता है, तो स्ट्रिंग उस XML डेटा के अनुरूप नहीं है जो मुझे उम्मीद है (मूल तत्व में गलत नाम है, बच्चों के तत्व गायब हैं आदि)।

उदाहरण के लिए:

public class MyXElement : XElement 
{ 

    public MyXElement(XElement element) 
     : base(element) 
    { } 

    public static bool TryParse(string xml, out MyXElement myElement) 
    { 
     XElement xmlAsXElement; 

     try 
     { 
      xmlAsXElement = XElement.Parse(xml); 
     } 
     catch (XmlException) 
     { 
      myElement = null; 
      return false; 
     } 

     // Use LINQ to check if xmlAsElement has correct nodes... 
    } 
संबंधित मुद्दे