سؤال

أقوم ببناء خدمة تُرجع XML (بدون صابون ، لا ذرة ، فقط XML القديم عادي). قل أن لديّ كائنات النطاق الخاصة بي مليئة بالفعل بالبيانات وأحتاج فقط إلى تحويلها إلى تنسيق XML. ما هي الخيارات التي لدي على .NET؟

متطلبات:

  • التحول ليس 1: 1. لنفترض أن لديّ خاصية عنوان من عنوان النوع مع خصائص متداخلة مثل الخط 1 ، المدينة ، الرمز البريدي ، إلخ. قد يؤدي هذا إلى أن يؤدي إلى XML مثل <xaddr city="...">Line1, Postcode</xaddr>, ، أي مختلفة تماما.
  • بعض عناصر/سمات XML مشروطة ، على سبيل المثال ، إذا كان العميل أقل من 18 عامًا ، فإن XML بحاجة إلى احتواء بعض المعلومات الإضافية.
  • أحتاج فقط إلى تسلسل الكائنات إلى XML ، الاتجاه الآخر (XML إلى الكائنات) ليس مهمًا
  • بعض التقنيات ، أي عقود البيانات تستخدم سمات .NET. وسائل أخرى للتكوين (تكوين XML الخارجي ، فئات الأصدقاء وما إلى ذلك) ستكون زائد.

فيما يلي الخيارات كما أراها على أنها اللحظة. سوف تكون التصحيحات / الإضافات موضع ترحيب كبير.

  • سلسلة متسلسل - انسى ذلك ، كانت مزحة :)
  • LINQ 2 XML - التحكم الكامل ولكن الكثير من التعليمات البرمجية المكتوبة يدويًا ، ستحتاج إلى مجموعة جيدة من اختبارات الوحدة
  • عرض المحركات في ASP.NET MVC (أو حتى أشكال الويب من الناحية النظرية) ، فإن المنطق في وحدات التحكم. إنه سؤال حول كيفية تنظيمه ، يمكن أن يكون لدي محرك قواعد بسيط في وحدة التحكم (وحدة التحكم) الخاصة بي وقالب عرض واحد لكل مخرج ممكن ، أو الحصول على منطق القرار مباشرة في القالب. كلاهما له جوانب وسلبيات.
  • XML التسلسل - لست متأكدًا من المرونة هنا
  • عقود البيانات من WCF - لست متأكدًا من المرونة أيضًا ، بالإضافة إلى أنها ستعمل في تطبيق ASP.NET MVC بسيط (خدمة غير WCF)؟ هل هي مجموعة كبيرة من التسلسل XML القياسي الآن؟
  • إذا كانت موجودة ، بعضها XML-to-Object Mapper. كلما فكرت في الأمر أكثر كلما اعتقدت أنني أبحث عن شيء من هذا القبيل ، لكنني لم أجد أي شيء مناسب.

أي تعليقات / خيارات أخرى؟

لا يوجد حل صحيح

نصائح أخرى

XML التسلسل يعمل بشكل جيد. يمكنك استخدام سمات لتكوينها.

يمكنك تضمين عناصر مشروطة.

تعديل: لقد قمت بتحديث الرمز لتعكس سؤالك المحدث.

[XmlRoot("pdata")]  // this element name used if serialized to doc root
public class PersonalData
{
     [XmlElement]  // with no name here, elt name = prop name
     public string Name;

     [XmlElement]  // with no name here, elt name = prop name
     public int Age;

     [XmlElement("xaddr")]  // override xml element name 
     public AddressData Address;

     [XmlElement] 
     public Under18Info Other {get; set;}

     // serialize the above element, only if Age < 18
     [XmlIgnore] // do not serialize the *Specified" property in any case
     private bool OtherSpecified {
        get { return Age < 18; }
     }
}

public class AddressData
{
     [XmlIgnore]   // do not serialize (see Composite prop)
     public string Line1 { get; set;}

     [XmlAttribute("city")] // serialize as an attribute on the parent 
     public string City {get; set;}

     [XmlIgnore]   // do not serialize 
     public string Postcode {get; set;}

     [XmlText]   // serialize as the Text node
     public string Composite 
     {
        get { return Line1 + ", " + Postcode; }
        set {
          var split = value.Split(',');
          Line1 = split[0];
          Postcode= split[1];
        }
     }
}

ثم ، لتسلسل مثيل لذلك إلى سلسلة ، على سبيل المثال:

var pdata = new PersonalData
    {
        Name = "Gordon Brown",
        Age = 57,
        Address = new AddressData
        {
            Line1 = "10 Downing St.",
            Postcode = "1QR 3E4",
            City = "London"
        }
    };

var ns= new System.Xml.Serialization.XmlSerializerNamespaces();
ns.Add( "", "");
var s1 = new XmlSerializer(typeof(PersonalData));
var builder = new System.Text.StringBuilder();
var xmlws = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };
using ( var writer = System.Xml.XmlWriter.Create(builder, xmlws))
{
    s1.Serialize(writer, pdata, ns);
}
string xml = builder.ToString();

نتائج:

<pdata>
  <Name>Gordon Brown</Name>
  <Age>57</Age>
  <xaddr city="London">10 Downing St., 1QR 3E4</xaddr>
</pdata>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top