Deserializing أكس مع البادئات مساحة الاسم التي هي غير معروف

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

  •  05-07-2019
  •  | 
  •  

سؤال

والرد أكس أتلقى هي كما يلي:

<response>
    <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="java:com.someDomain.item">
        <name>some name</disc-name>
        <description>some description</disc-desc>
    </item>
    <item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="java:com.someDomain.item">
            <name>some name</disc-name>
            <description>some description</disc-desc>
    </item>
    <otherValue>12.1</otherValue>
</response>

وزينت صفي على هذا النحو:

[XmlElement("item")]
public Item[] Items{get;set;}
[XmlElement("otherValue")
public string OtherValue{get;set;}

وعندما أحاول إلغاء تسلسل أكس أم أل لفئة وصفها، أتلقى خطأ "" جافا "النطاق بادئة لم يتم تعريف". إضافة من "مساحة" السمة إلى فئة يحل الخطأ إعراب (ومع ذلك، ثم شوهت أكس من النص الأصلي).

وأي

[XmlElement(ElementName="item",Namespace="java")]

وكيف يجب أن يكون تزيين خاصية معينة لمتابعة المباراة مع مساحة اسم جديد؟ أو، كيف يمكنني بشكل صحيح تحديد مساحة الاسم؟

وأنا لست 100٪ على استخدام مجموعة من الأوراق المالية لبلدي قسم enumerable سواء، ولكن أعتقد أن القضية مساحة يأخذ precident في الوقت الراهن. أي فكرة أو أفكار هي موضع تقدير كبير!

وUPDATE:

وأعتقد أن إعادة صياغة السؤال بشكل أفضل الآن بأنني قد ذهبت ذهابا وإيابا قليلا:

وكيف كنت تستخدم XmlElementAttribute (أو سمات أخرى) لفئة التي يمكن إجراء تسلسل في البند قصاصة أعلاه، بما في ذلك العلامات XSI؟

وأما بالنسبة لي مشكلة خاصة، لقد أدركت منذ استجابة XML خارج عن إرادتي، أنا لست بحاجة إلى سمات XSI لتبدأ. إلى حل قضية التسلسل، أنا ببساطة القيام بما يلي (عنصر XmlElement يحتوي على الوثيقة الأصلية أعلاه):

foreach(XmlNode node in element)
node.Attributes.RemoveAll();

وأنا مشيرا فقط بلدي الحل الشخصية لأن هذا ليس في الواقع حل.

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

المحلول

للأسف هذا هو XML صحيح، وتماما يتوافق مع XML قياسي. ذلك بالتحقق من صحة، فإنه من الصحيح وانها كاملة.

والمشكلة كنت تواجه هي في إلغاء التسلسل، وهي ليست جزءا من XML القياسية والمتعلقة بكيفية الخرائط. NET أعلن أنواع XML إلى أنواع CLR الداخلية.

ووXSI: نوع هو مرجع مساحة الاسم ويهدف إلى السماح ثائق XML لبديلا نوع المستمدة من مساحة اسم آخر لنوع أعلن في المخطط.

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

وأنت لا تحتاج حتى تحتاج إلى تضمين مساحة الاسم الأجنبي من أجل هذا لاعتبار صحيح.

و(انظر هذه المادة لمزيد من صراخ حول هذا الموضوع: HTTP: // نورمان. walsh.name/2004/01/29/trainwreck )

والآن، في كيفية التعامل مع مشكلة المعلنة الخاص بك: إلغاء تسلسل هذه الفوضى. 1) معالجة النص XML و إزالة إعلان XSI-أنواع ونأمل أن هناك أية حقول أعلن أن تمديد النوع الأساسي. 2) تعريف نوع مشتقة من نوع قاعدة الخاص بك في المخطط.

وهذا يشبه ما يلي:

// note this "XmlIncludeAttribute" references the derived type.
// note that in .NET they are in the same namespace, but in XML they are in different namespaces.
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DerivedType))]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://BaseNameSpace")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://BaseNameSpace", IsNullable=true)]
public partial class MyBaseType : object
{
...
}

/// <remarks/>
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://DerivedNameSpace")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://DerivedNameSpace", IsNullable=true)]
public partial class DerivedType: MyBaseType 
{
...
}

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

نصائح أخرى

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

ويمكنك استخدام List<Item> بدلا من Item[].

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