سؤال

لذلك أحاول تحليل ملف XML:

 <?xml version="1.0" encoding="utf-8" ?>
<Root>    
  <att1 name="bob" age="unspecified" xmlns="http://foo.co.uk/nan">    
  </att1>    
</Root>

باستخدام التعليمات البرمجية التالية:

XElement xDoc= XElement.Load(filename);
var query = from c in xDoc.Descendants("att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

لا شيء مكتوب إلى وحدة التحكم إلا إذا قمت بحذف XMLNS = "http://foo.co.uk/nan" من ملف XML، وبعد ذلك، أحصل على قائمة بأسماء السمة والقيم كما يتوقع المرء، وأنا بحاجة في

تحرير: التنسيق.

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

المحلول

يجب عليك استخدام نفس مساحة الاسم في التعليمات البرمجية الخاصة بك:

XElement xDoc= XElement.Load(filename);
XNamespace ns = "http://foo.co.uk/nan";
var query = from c in xDoc.Descendants(ns + "att1").Attributes() select c;
foreach (XAttribute a in query)
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}

السمات لا تلتقط الافتراضي (xmlns=....) مساحة الاسم، لذلك لا تحتاج إلى تأهيلها. علامة اسم الاسم (xmln:tags=....) محلية بحتة إلى المستند أو استخدام API، والأسماء هي حقا مساحة الاسم + الاسم المحلي دائما حتى يتعين عليك دائما تحديد مساحة الاسم.

نصائح أخرى

مكالمتك إلى أحفاد هو الاستعلام عن عنصر يدعى "ATT1" في مساحة الاسم.

إذا اتصلت بذلك Descendants("{http://foo.co.uk/nan}att1") يمكنك تحديد عنصر Namespaced ولكن ليس العنصر غير الأساسي.

يمكنك تحديد العناصر المسماة "ATT1" في أي مساحة اسم أو لا مثل هذا:

var query = from c in xDoc.Descendants() where c.Name.LocalName == "att1" select c.Attributes;

تحتاج إلى تحديد مساحة الاسم في Descendants اتصل، مثل هذا:

XNamespace ns = "http://foo.co.uk/nan";
foreach (XAttribute a in xDoc.Descendants(ns + "att1"))
{
    Console.WriteLine("{0}, {1}",a.Name,a.Value);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top