مرتبك حول مساحات الأسماء في تغذية الذرة
-
01-10-2019 - |
سؤال
هل هناك أي فرق بين
<opensearch:totalResults>1000</opensearch:totalResults>
و
<totalResults xmlns="opensearch">1000</totalResults>
أنا أستخدم فئة SyndicationFeed في .NET لإنشاء خلاصة ذرة ، وأحتاج إلى إضافة بعض العناصر لمعيار OpenSearch ، لكنها تستمر في إضافة عناصر مثل العناصر الأخيرة أعلاه عندما أريد أن تضيفها مثل السابق.
الرمز:
feed.ElementExtensions.Add("totalResults", "opensearch", "2");
تعديل
تبدو علامة تغذية الجذر هكذا
<feed xml:lang="en-US" p1:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:p1="xmlns" xmlns="http://www.w3.org/2005/Atom">
بعد تغيير الكود الخاص بي كما هو مقترح RredDog ، يبدو عنصر TotalResults هكذا
<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">1000</totalResults>
الرمز الذي يضيف مساحة الاسم إلى علامة التغذية يبدو هكذا
feed.AttributeExtensions.Add(
new XmlQualifiedName("opensearch", "xmlns"),
@"http://a9.com/-/spec/opensearch/1.1/");
والرمز الذي يضيف عنصر TotalResults يبدو الآن هكذا
feed.ElementExtensions.Add("totalResults", @"http://a9.com/-/spec/opensearch/1.1/", "1000");
المحلول
لا تهتم. أدركت أنني كنت أضيف مساحة الاسم بشكل غير صحيح. يجب أن يكون
feed.AttributeExtensions.Add(
new XmlQualifiedName("opensearch", "http://www.w3.org/2000/xmlns/"),
"http://a9.com/-/spec/opensearch/1.1/");
نصائح أخرى
مساحات الأسماء
ورثت مساحات الأسماء الافتراضية من العنصر الأصل. وإلا ، يمكنك تحديد الأسماء المستعارة الجديدة لأطفالك لاستخدامها مع xmlns:alias=
بناء الجملة أو يمكنك إعادة تعريف مساحة الاسم الافتراضية لاستخدامها لعنصر (وبالطبع أطفاله) باستخدام xmlns=
بناء الجملة.
المثال الأول:
<opensearch:totalResults>1000</opensearch:totalResults>
يتطلب أن يتم تحديد اسم اسم اسم اسم "OpenSearch" بواسطة عنصر الأصل - ربما في مساحة اسم مختلفة. فمثلا:
<myRoot xmlms:opensearch="http://a9.com/-/spec/opensearch/1.1/">
<opensearch:totalResults>1000</opensearch:totalResults>
</myRoot>
على الرغم من أن هذا يعني أن عنصر "myroot" في مساحة اسم مختلفة - أي العنصر الافتراضي (مع مساحة اسم فارغة أو تلك المحددة من قبل الوالد).
الإدراج
من أجل إضافة العنصر فعليًا مع مساحة الاسم الصحيحة ، ستحتاج إلى استخدام مساحة الاسم نفسها ، بدلاً من الاسم المستعار ("OpenSearch").
لذلك ، لإضافة العنصر الجديد الخاص بك ، ستحتاج إما للاستيلاء على مساحة الاسم من العقدة الأصل (أو فقط تعرفه عليها وترميزها الثابت).
على سبيل المثال
feed.ElementExtensions.Add("totalResults", "http://a9.com/-/spec/opensearch/1.1/", 1000);
ولكن لاحظ أنه سيكون لديك سيطرة محدودة أو بدون تحكم في الاسم المستعار المعين على مساحة الاسم. من أجل القيام بذلك ، سيتعين عليك السيطرة على عملية تسلسل XML ...
لتكون أكثر اكتمالا.
تعيين حدد مساحة الاسم على عنصر القناة مع:
feed.AttributeExtensions.Add(
new XmlQualifiedName("opensearch", XNamespace.Xmlns.ToString()),
"http://a9.com/-/spec/opensearch/1.1/");
وحدد مساحة الاسم على TotalResults مع:
feed.ElementExtensions.Add("totalResults", "http://a9.com/-/spec/opensearch/1.1/", "1000");
سوف يمنحك:
<opensearch:totalResults>1000</opensearch:totalResults>