كيفية منع سمات xmlns الفارغة في الإخراج من XmlDocument الخاص بـ .NET؟

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

سؤال

عند إنشاء XML من XmlDocument في .NET، يظهر فارغًا xmlns تظهر السمة في المرة الأولى التي يظهر فيها العنصر بدون يتم إدراج مساحة الاسم المرتبطة؛كيف يمكن لهذا أن يمنع؟

مثال:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
    "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);

انتاج:

<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>

مرغوب انتاج:

<root xmlns="whatever:name-space-1.0"><loner /></root>

هل هناك حل ينطبق على XmlDocument رمز، وليس شيئا يحدث بعد تحويل المستند إلى سلسلة مع OuterXml?

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

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

المحلول

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

الكود الثابت:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml);

شكرًا للجميع على جميع إجاباتكم التي قادتني في الاتجاه الصحيح!

نصائح أخرى

هذا هو البديل من إجابة JeniT (شكرًا جزيلاً لك!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

وهذا يلغي الاضطرار إلى نسخ مساحة الاسم أو تكرارها في كل مكان.

إذا <loner> العنصر الموجود في نموذج XML الخاص بك لا يحتوي على xmlns إعلان مساحة الاسم الافتراضي عليه، فسيكون في ملف whatever:name-space-1.0 مساحة الاسم بدلاً من عدم وجود مساحة اسم.إذا كان هذا هو ما تريده، فأنت بحاجة إلى إنشاء العنصر في مساحة الاسم تلك:

xml.CreateElement("loner", "whatever:name-space-1.0")

إذا كنت تريد <loner> عنصرًا لا يوجد في مساحة اسم، فإن XML الذي تم إنتاجه هو بالضبط ما تحتاجه، ولا يجب أن تقلق بشأن xmlns السمة التي تمت إضافتها تلقائيًا لك.

نظرًا لأن الجذر موجود في مساحة اسم غير مسبوقة، فإن أي فرع للجذر يريد أن يكون غير مسافات الاسم يجب أن يتم إخراجه مثل المثال الخاص بك.سيكون الحل هو بادئة العنصر الجذر مثل ذلك:

<w:root xmlns:w="whatever:name-space-1.0">
   <loner/>
</w:root>

شفرة:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);

إذا أمكن، قم بإنشاء فئة تسلسل ثم قم بما يلي:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);

إنه أكثر أمانًا، ويمكنك التحكم في مساحات الأسماء باستخدام السمات إذا كنت حقًا بحاجة إلى مزيد من التحكم.

لقد قمت بحل المشكلة باستخدام نمط المصنع.لقد قمت بإنشاء مصنع لكائنات XElement.كمعلمة لإنشاء مثيل للمصنع، قمت بتحديد كائن XNamespace.لذلك، في كل مرة يتم فيها إنشاء XElement بواسطة المصنع، ستتم إضافة مساحة الاسم تلقائيًا.وهذا هو كود المصنع:

internal class XElementFactory
{
    private readonly XNamespace currentNs;

    public XElementFactory(XNamespace ns)
    {
        this.currentNs = ns;
    }

    internal XElement CreateXElement(String name, params object[] content)
    {
        return new XElement(currentNs + name, content);
    }
}

نعم يمكنك منع XMLNS من XmlElement .أولًا: وقت الخلق قادم:مثل هذا

<trkpt lat="30.53597" lon="-97.753324" xmlns="">
    <ele>249.118774</ele>
    <time>2006-05-05T14:34:44Z</time>
</trkpt>

تغيير الكود :وتمرير مساحة اسم XML مثل هذا

كود سي#:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top