ما هي أفضل طريقة لاختبار صلاحية XML من إحدى الطرق؟

StackOverflow https://stackoverflow.com/questions/117007

سؤال

لدي بعض أساليب WCF التي تُستخدم لنقل المعلومات من تطبيق الخادم إلى الواجهة الأمامية لموقع الويب لاستخدامها في الربط.أقوم بإرسال النتيجة كعنصر XElement وهو جذر لشجرة XML تحتوي على البيانات التي أريد الارتباط بها.

أرغب في إنشاء بعض الاختبارات التي تفحص البيانات وتتأكد من ظهورها كما هو متوقع.

تفكيري الحالي هو هذا:تحتوي كل طريقة تقوم بإرجاع شجرة XElement على ملف مخطط (.XSD) مطابق.يتم تضمين هذا الملف ضمن التجميع الذي يحتوي على فئات WCF الخاصة بي كمورد مضمن.

تستدعي الاختبارات الطريقة على هذه الطرق وتقارن النتيجة بهذه المخططات المضمنة.

هل هذه فكرة جيدة؟إذا لم يكن الأمر كذلك، ما هي الطرق الأخرى التي يمكنني استخدامها لتوفير "ضمان" لنوع XML الذي ستعيده الطريقة؟

إذا كان الأمر كذلك، كيف يمكنك التحقق من صحة XElement مقابل المخطط؟وكيف يمكنني الحصول على هذا المخطط من التجميع المضمن فيه؟

هل كانت مفيدة؟

المحلول

أقول إن التحقق من صحة XML باستخدام مخطط xsd يعد فكرة جيدة.

كيفية التحقق من صحة 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));

نصائح أخرى

إذا كنت تقوم ببعض الأعمال الخفيفة وكانت XSD مبالغ فيها، ففكر أيضًا في كتابة بيانات XML الخاصة بك بقوة.على سبيل المثال، لدي عدد من الفئات في مشروع مشتق من XElement.أحدهما هو ExceptionXElement، والآخر هو HttpHeaderXElement، وما إلى ذلك.فيها، أرث من XElement وأضيف أساليب Parse و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...
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top