c# - كيف يمكن للمرء تحليل ملفات XML؟




(8)

هل هناك طريقة بسيطة لتحليل ملفات XML في C #؟ إذا كان الأمر كذلك ما؟


إذا كنت تستخدم .NET 2.0 ، فجرّب XmlReader والفئات الفرعية الخاصة به XmlTextReader ، و XmlValidatingReader . أنها توفر سريعة وخفيفة الوزن (استخدام الذاكرة ، وما إلى ذلك) ، والطريقة إلى الأمام فقط لتحليل ملف XML.

إذا كنت بحاجة إلى قدرات XPath ، فجرّب XPathNavigator . إذا كنت بحاجة إلى المستند بأكمله في الذاكرة حاول XmlDocument .


إذا كنت تقوم بمعالجة كمية كبيرة من البيانات (عدة ميغابايت) فأنت تريد استخدام XmlReader لدفق تحليل XML.

أي شيء آخر ( XPathNavigator و XElement و XmlDocument وحتى XmlSerializer إذا احتفظت بالرسم الكامل للكائن الذي تم إنشاؤه) سيؤدي إلى استخدام عالي للذاكرة وكذلك وقت تحميل بطيء للغاية.

بالطبع ، إذا كنت بحاجة إلى جميع البيانات في الذاكرة على أي حال ، فقد لا يكون لديك خيار كبير.



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

وهنا بعض الأمثلة:

XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file

// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); 
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");

// Display the results
Console.WriteLine("Address: " + girlAddress[0].InnerText);
Console.WriteLine("Age: " + girlAge[0].InnerText);
Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText);

أيضا ، هناك بعض الطرق الأخرى للعمل معها. على سبيل المثال ، here . وأعتقد أنه لا يوجد طريقة واحدة أفضل للقيام بذلك ؛ تحتاج دائمًا إلى اختياره بنفسك ، ما هو الأنسب لك.


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

يمكنك الانتقال باستخدام LINQ to XML أو XmlReader أو XPathNavigator أو حتى التعبيرات العادية. إذا قمت بتوضيح احتياجاتك ، يمكنني محاولة تقديم بعض الاقتراحات.


لقد طُلب مني في الآونة الأخيرة العمل على تطبيق يتضمن تحليل مستند XML وأوافق مع Jon Galloway على أن نهج LINQ to XML هو ، في رأيي ، الأفضل. لكنني اضطررت إلى البحث قليلاً للعثور على أمثلة قابلة للاستخدام ، لذلك دون مزيد من اللغط ، فإليك عدد قليل!

نرحب بأي تعليقات حيث يعمل هذا الرمز ولكن قد لا يكون مثالياً وأود أن أعرف المزيد عن تحليل XML لهذا المشروع!

public void ParseXML(string filePath)  
{  
    // create document instance using XML file path
    XDocument doc = XDocument.Load(filePath);

    // get the namespace to that within of the XML (xmlns="...")
    XElement root = doc.Root;
    XNamespace ns = root.GetDefaultNamespace();

    // obtain a list of elements with specific tag
    IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;

    // obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
    XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();

    // obtain an element from within an element, same as from doc
    XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();

    // obtain an attribute from an element
    XAttribute attribute = element.Attribute("exampleAttributeName");
}

مع هذه الوظائف كنت قادرا على تحليل أي عنصر وأي سمة من ملف XML لا توجد مشكلة على الإطلاق!


يمكنك استخدام XmlDocument وللتعامل مع البيانات أو استعادتها من السمات التي يمكنك استخدامها لينكس لفئات XML.


يمكنك تحليل XML باستخدام هذه المكتبة System.Xml.Linq . في ما يلي نموذج التعليمة البرمجية التي استخدمتها في تحليل ملف XML

public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
    string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);

    XDocument xDoc = XDocument.Load(path);

    XElement xElement = XElement.Parse(xDoc.ToString());


    List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
    {
        Code = Convert.ToString(d.Element("CategoryCode").Value),
        CategoryPath = d.Element("CategoryPath").Value,
        Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
        SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
    }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();

    CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);

    return catSubCatList;
}




xml