XElement مساحة الاسم الافتراضي على سمات يوفر سلوك غير متوقع

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

سؤال

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

<Root xmlns="http://www.adventure-works.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.SomeLocatation.Com/MySchemaDoc.xsd">
  <Book title="Enders Game" author="Orson Scott Card" />
  <Book title="I Robot" author="Isaac Asimov" />
</Root>

ولكن ما أنا في نهاية المطاف مع هذا ...

<Root xmlns="http://www.adventure-works.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.SomeLocatation.Com/MySchemaDoc.xsd">
  <Book p3:title="Enders Game" p3:author="Orson Scott Card" xmlns:p3="http://www.adventure-works.com" />
  <Book p3:title="I Robot" p3:author="Isaac Asimov" xmlns:p3="http://www.adventure-works.com" />
</Root>

والتعليمات البرمجية التي كتبت لإنتاج هذا المقتطف XML هو هذا ...

  XNamespace aw = "http://www.adventure-works.com";
  XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
  XElement root = new XElement(aw + "Root",
      new XAttribute("xmlns", "http://www.adventure-works.com"),
      new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
      new XAttribute(xsi + "SchemaLocation", "http://www.SomeLocatation.Com/MySchemaDoc.xsd"),

      new XElement(aw + "Book",
        new XAttribute(aw + "title", "Enders Game"),
        new XAttribute(aw + "author", "Orson Scott Card")),
      new XElement(aw + "Book",
        new XAttribute(aw + "title", "I Robot"),
        new XAttribute(aw + "author", "Isaac Asimov")));

وعلى أساس سبيل المثال على MSDN

و**** **** تحرير

وطيب، مع بعض أكثر التجريب وأنا الآن في حيرة من أمري في كيفية عمل مساحات أسماء XML ....

وإذا أزيل فصيل عبد الواحد + theattribute أحصل على ما كنت بعد ... ولكن الآن يبدو أن ما كنت بعد ليست في الواقع ما كنت أتوقع. وأعتقد أن بمساحات ورثت عن والديهم، وهذا لا ينطبق على سمات كذلك؟ لأن هذا الرمز لقراءة سمات لا تعمل كما هو متوقع ...

  XElement xe = XElement.Parse(textBox1.Text);
  XNamespace aw = "http://www.adventure-works.com";
  var qry = from x in xe.Descendants(aw + "Book")
            select (string)x.Attribute(aw + "author");

ولكن إذا كنت إزالة فصيل عبد الواحد + على السمة عن طيب، يقودني إلى نفترض أنني لا يمكن أن يكون لها سمات في مساحة الاسم الافتراضي. فهل هذا صحيح؟

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

المحلول

وسؤال جيد. أنا حفرت حول قليلا، ووجدت هذا قليلا من المواصفات XML :

<اقتباس فقرة>   

وإعلان مساحة الاسم الافتراضية   ينطبق على جميع العناصر غير المسبوقة ببادئة   أسماء ضمن نطاقه. الإفتراضي   لا تنطبق الإعلانات مساحة الاسم   مباشرة إلى أسماء السمة. ال   تفسير غير المسبوقة ببادئة   سمات يتم تحديدها من قبل   العنصر الذي ظهورها.

ووغني في وقت لاحق لإعطاء هذا المثال:

<اقتباس فقرة>   

وعلى سبيل المثال، كل من العلامات خالي عنصر سيئة غير قانوني في ما يلي:

<!-- http://www.w3.org is bound to n1 and n2 -->
<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  <bad a="1"     a="2" />
  <bad n1:a="1"  n2:a="2" />
</x>
<اقتباس فقرة>   

ولكن، كل من العناصر التالية هو قانوني، والثاني لأن مساحة الاسم الافتراضي لا> ينطبق على أسماء السمة:

<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org" 
   xmlns="http://www.w3.org" >
  <good a="1"     b="2" />
  <good a="1"     n1:a="2" />
</x>

وذلك في الأساس، يبدو أن أسماء السمات لا تحصل بمساحات افتراضيا، وهو ما يفسر كل شيء كنت قد رأيت:)

نصائح أخرى

XElement doc = XElement.Parse(ToXml());
doc.DescendantsAndSelf().Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
var ele = doc.DescendantsAndSelf();
foreach (var el in ele)
    el.Name = ns != null ? ns + el.Name.LocalName : el.Name.LocalName;

لأي شخص آخر الذي أمضى 2 أيام في محاولة للعثور على إجابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top