كيفية التعامل مع XML في C#




.net (8)

ما هي أفضل طريقة للتعامل مع وثائق XML ، XSD وغيرها في C # 2.0؟

ما هي الفئات التي تستخدم إلخ. ما هي أفضل ممارسات التحليل وصنع مستندات XML وما إلى ذلك.

تحرير: الاقتراحات. صافي 3.5 هي أيضا موضع ترحيب.



nyxtom،

لا يجب أن تطابق "doc" و "xdoc" في مثال 1؟

XDocument **doc** = XDocument.Load(pathToXml);
List<Person> people = (from xnode in **xdoc**.Element("People").Elements("Person")
                   select new Person
                   {
                       Name = xnode.Attribute("Name").Value
                   }).ToList();

إجابة Cookey جيدة ... لكن إليك تعليمات مفصلة حول كيفية إنشاء كائن تمت كتابته بقوة من XSD (أو XML) والتسلسل / إلغاء التسلسل في بضعة أسطر من الكود:

Instructions


إجابة nyxtom جيدة جدا. سأضيف بضعة أمور إليها:

إذا كنت تحتاج إلى وصول للقراءة فقط إلى مستند XML ، يعد XPathDocument كائنًا أخف وزنًا بكثير من XmlDocument .

الجانب السلبي من استخدام XPathDocument هو أنه لا يمكنك استخدام أساليب SelectNodes و SelectSingleNode المعتادة لـ XmlNode . بدلاً من ذلك ، يجب عليك استخدام الأدوات التي IXPathNavigable : استخدم CreateNavigator لإنشاء XPathNavigator ، واستخدم XPathNavigator لإنشاء XPathNodeIterator للتكرار عبر قوائم العقد التي تعثر عليها عبر XPath. يتطلب هذا بشكل عام بضعة أسطر من التعليمات البرمجية من أساليب XmlDocument .

ولكن: تقوم XmlNode XmlDocument و XmlNode بتطبيق IXPathNavigable ، لذا فإن أي كود تكتبه لاستخدام هذه الطرق على XPathDocument سيعمل أيضا على XmlDocument . إذا IXPathNavigable على الكتابة ضد IXPathNavigable ، يمكن أن تعمل الأساليب الخاصة بك ضد أي كائن. (هذا هو السبب في استخدام XmlNode و XmlDocument في التواقيع الأسلوب من قِبل FxCop.)

XElement ، لا يقوم XDocument و XElementXNode و XObject ) بتطبيق IXPathNavigable .

شيء آخر غير موجود في إجابة nyxtom هو XmlReader . استخدام XmlReader لتجنب XmlReader الحمل من توزيع دفق XML إلى طراز كائن قبل بدء معالجته. بدلاً من ذلك ، يمكنك استخدام XmlReader لمعالجة عقدة XML دفق الإدخال واحد في كل مرة. هذا هو أساسا الإجابة .NET ل SAX. يتيح لك كتابة التعليمات البرمجية السريعة جدًا لمعالجة مستندات XML كبيرة جدًا.

يوفر XmlReader أيضاً أبسط طريقة لمعالجة أجزاء مستند XML ، على سبيل المثال دفق عناصر XML مع عدم وجود عنصر تشفير إرجاع SQL Server FOR XML RAW.

بشكل عام يتم ربط التعليمة البرمجية التي تكتبها باستخدام XmlReader بشدة بتنسيق XML الذي يقرأه. إن استخدام XPath يسمح لك أن تكون الشفرة أكثر بكثير ، مقترنة بشكل كبير مع XML ، وهذا هو السبب في أنها بشكل عام هي الإجابة الصحيحة. ولكن عندما تحتاج إلى استخدام XmlReader ، فأنت بحاجة إليه بالفعل.


إذا كنت تعمل في .NET 3.5 وأنت غير خائف من الكود التجريبي يمكنك التحقق من LINQ إلى XSD ( http://blogs.msdn.com/xmlteam/archive/2008/02/21/linq-to-xsd-alpha-0-2.aspx ) التي ستقوم بتوليد فئات .NET من XSD (بما في ذلك القواعد المضمنة من XSD).

عندها القدرة على الكتابة مباشرة إلى ملف وقراءة من ملف التأكد من أنه يتوافق مع قواعد XSD.

أقترح بالتأكيد الحصول على XSD لأي مستند XML تعمل معه:

  • يسمح لك بفرض القواعد في XML
  • يسمح للآخرين برؤية كيفية هيكلة / XML
  • يمكن استخدامها للتحقق من XML

أجد أن Liquid XML Studio هو أداة رائعة لتوليد XSD وهي مجانية!


رأيي الشخصي ، كمبرمج C # ، هو أن أفضل طريقة للتعامل مع XML في C # هي تفويض ذلك الجزء من التعليمات البرمجية إلى مشروع VB .NET. في .NET 3.5 ، يحتوي VB .NET على Lderals XML ، مما يجعل التعامل مع XML أكثر بديهية. انظر هنا ، على سبيل المثال:

نظرة عامة على LINQ إلى XML في Visual Basic

(تأكد من ضبط الصفحة لعرض كود VB ، وليس رمز C #.)

سأكتب بقية المشروع في C # ، ولكن التعامل مع XML في مشروع VB المشار إليه.


يتعلق بالمقاس؛ بالنسبة لـ xml إلى الحجم المتوسط ​​xml ، فإن DOM مثل XmlDocument (أي إصدارات C # /. NET) أو XDocument (.NET 3.5 / C # 3.0) هو الفائز الواضح. لاستخدام xsd ، يمكنك تحميل xml باستخدام XmlReader ثم يقبل XmlReader (إلى Create ) XmlReaderSettings . تحتوي كائنات XmlReaderSettings على خاصية Schemas التي يمكن استخدامها لإجراء التحقق من صحة xsd (أو dtd).

للكتابة xml ، تنطبق نفس الأشياء ، مع ملاحظة أنه من الأسهل قليلاً وضع محتوى باستخدام LINQ-to-XML (XDocument) من XmlDocument الأقدم.

ومع ذلك ، بالنسبة لـ xml ضخم ، قد يضخم DOM مساحة كبيرة من الذاكرة ، وفي هذه الحالة قد تحتاج إلى استخدام XmlReader / XmlWriter مباشرة.

أخيراً ، من أجل معالجة xml قد ترغب في استخدام XslCompiledTransform (طبقة xslt).

البديل للعمل مع xml هو العمل مع طراز كائن؛ يمكنك استخدام xsd.exe لإنشاء فئات تمثل نموذجًا متوافقًا مع xsd ، وتحميل xml ببساطة ككائنات ، والتعامل مع OO ، ثم إجراء تسلسل لتلك الكائنات مرة أخرى ؛ تفعل هذا مع XmlSerializer .


يتم إجراء الوسائل الأساسية للقراءة والكتابة في C # 2.0 من خلال فئة XmlDocument . يمكنك تحميل معظم إعداداتك مباشرة في XmlDocument من خلال XmlReader الذي يقبله.

تحميل XML مباشرة

XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");

تحميل XML من ملف

XmlDocument document = new XmlDocument();
document.Load(@"C:\Path\To\xmldoc.xml");
// Or using an XmlReader/XmlTextReader
XmlReader reader = XmlReader.Create(@"C:\Path\To\xmldoc.xml");
document.Load(reader);

أجد أسهل / أسرع طريقة لقراءة مستند XML باستخدام XPath.

قراءة مستند XML باستخدام XPath (باستخدام XmlDocument الذي يسمح لنا بالتحرير)

XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");

// Select a single node
XmlNode node = document.SelectSingleNode("/People/Person[@Name = 'Nick']");

// Select a list of nodes
XmlNodeList nodes = document.SelectNodes("/People/Person");

إذا كنت بحاجة إلى العمل مع مستندات XSD للتحقق من صحة مستند XML ، يمكنك استخدام هذا.

التحقق من صحة وثائق XML ضد مخططات XSD

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidateType = ValidationType.Schema;
settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd

XmlReader reader = XmlReader.Create(pathToXml, settings);
XmlDocument document = new XmlDocument();

try {
    document.Load(reader);
} catch (XmlSchemaValidationException ex) { Trace.WriteLine(ex.Message); }

التحقق من XML مقابل XSD في كل عقدة (التحديث 1)

XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidateType = ValidationType.Schema;
settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd
settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);

XmlReader reader = XmlReader.Create(pathToXml, settings);
while (reader.Read()) { }

private void settings_ValidationEventHandler(object sender, ValidationEventArgs args)
{
    // e.Message, e.Severity (warning, error), e.Error
    // or you can access the reader if you have access to it
    // reader.LineNumber, reader.LinePosition.. etc
}

كتابة مستند XML (يدويًا)

XmlWriter writer = XmlWriter.Create(pathToOutput);
writer.WriteStartDocument();
writer.WriteStartElement("People");

writer.WriteStartElement("Person");
writer.WriteAttributeString("Name", "Nick");
writer.WriteEndElement();

writer.WriteStartElement("Person");
writer.WriteStartAttribute("Name");
writer.WriteValue("Nick");
writer.WriteEndAttribute();
writer.WriteEndElement();

writer.WriteEndElement();
writer.WriteEndDocument();

writer.Flush();

(تحديث 1)

في .NET 3.5 ، يمكنك استخدام XDocument لتنفيذ مهام مشابهة. ومع ذلك ، فإن الاختلاف لديك ميزة تنفيذ استعلامات Linq لتحديد البيانات الدقيقة التي تحتاجها. مع إضافة مُهيئات الكائنات ، يمكنك إنشاء استعلام يقوم حتى بإرجاع كائنات من التعريف الخاص بك مباشرةً في الاستعلام نفسه.

    XDocument doc = XDocument.Load(pathToXml);
    List<Person> people = (from xnode in doc.Element("People").Elements("Person")
                       select new Person
                       {
                           Name = xnode.Attribute("Name").Value
                       }).ToList();

(تحديث 2)

طريقة لطيفة في .NET 3.5 هي استخدام XDocument لإنشاء XML أدناه. هذا يجعل الرمز يظهر في نمط مماثل إلى الإخراج المطلوب.

XDocument doc =
        new XDocument(
              new XDeclaration("1.0", Encoding.UTF8.HeaderName, String.Empty),
              new XComment("Xml Document"),
              new XElement("catalog",
                    new XElement("book", new XAttribute("id", "bk001"),
                          new XElement("title", "Book Title")
                    )
              )
        );

يخلق

<!--Xml Document-->
<catalog>
  <book id="bk001">
    <title>Book Title</title>
  </book>
</catalog>

فشل كل شيء آخر ، يمكنك التحقق من هذه المقالة MSDN لديها العديد من الأمثلة التي ناقشتها هنا وأكثر من ذلك. http://msdn.microsoft.com/en-us/library/aa468556.aspx







xml