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




(10)

أولاً ، تعرف على فصول XDocument و XElement الجديدة ، لأنها تمثل تحسينًا على عائلة XmlDocument السابقة.

  1. انهم يعملون مع LINQ
  2. هم أسرع وأكثر خفيفة الوزن

ومع ذلك ، قد يلزمك الاستمرار في استخدام الفئات القديمة للعمل باستخدام التعليمة البرمجية القديمة - وخصوصًا الوكلاء الذين تم إنشاؤهم سابقًا. في هذه الحالة ، ستحتاج إلى التعرف على بعض الأنماط للتشغيل بين فئات معالجة XML.

أعتقد أن سؤالك واسع للغاية ، وسوف يتطلب الكثير في إجابة واحدة لإعطاء التفاصيل ، ولكن هذا هو أول إجابة عامة فكرت فيها ، ويشكل بداية.

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

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

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


إذا قمت بإنشاء مجموعة بيانات مكتوبة في المصمم ، فستحصل تلقائيًا على xsd ، وهو كائن تم كتابته بقوة ، ويمكن تحميل وحفظ xml مع سطر واحد من التعليمات البرمجية.


يتم إجراء الوسائل الأساسية للقراءة والكتابة في 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


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

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

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

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


كتابة XML مع فئة XmlDocument

//itemValues is collection of items in Key value pair format
//fileName i name of XML file which to creatd or modified with content
    private void WriteInXMLFile(System.Collections.Generic.Dictionary<string, object> itemValues, string fileName)
    {
        string filePath = "C:\\\\tempXML\\" + fileName + ".xml";
        try
        {

            if (System.IO.File.Exists(filePath))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(filePath);                   

                XmlNode rootNode = doc.SelectSingleNode("Documents");

                XmlNode pageNode = doc.CreateElement("Document");
                rootNode.AppendChild(pageNode);


                foreach (string key in itemValues.Keys)
                {

                    XmlNode attrNode = doc.CreateElement(key);
                    attrNode.InnerText = Convert.ToString(itemValues[key]);
                    pageNode.AppendChild(attrNode);
                    //doc.DocumentElement.AppendChild(attrNode);

                }
                doc.DocumentElement.AppendChild(pageNode);
                doc.Save(filePath);
            }
            else
            {
                XmlDocument doc = new XmlDocument();
                using(System.IO.FileStream fs = System.IO.File.Create(filePath))
                {
                    //Do nothing
                }

                XmlNode rootNode = doc.CreateElement("Documents");
                doc.AppendChild(rootNode);
                doc.Save(filePath);

                doc.Load(filePath);

                XmlNode pageNode = doc.CreateElement("Document");
                rootNode.AppendChild(pageNode);

                foreach (string key in itemValues.Keys)
                {                          
                    XmlNode attrNode = doc.CreateElement(key);                           
                    attrNode.InnerText = Convert.ToString(itemValues[key]);
                    pageNode.AppendChild(attrNode);
                    //doc.DocumentElement.AppendChild(attrNode);

                }
                doc.DocumentElement.AppendChild(pageNode);

                doc.Save(filePath);

            }
        }
        catch (Exception ex)
        {

        }

    }

OutPut look like below
<Dcouments>
    <Document>
        <DocID>01<DocID>
        <PageName>121<PageName>
        <Author>Mr. ABC<Author>
    <Dcoument>
    <Document>
        <DocID>02<DocID>
        <PageName>122<PageName>
        <Author>Mr. PQR<Author>
    <Dcoument>
</Dcouments>


يتعلق بالمقاس؛ بالنسبة لـ 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 .


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






c# .net xml