خيارات التسلسل XML في .NET
-
25-09-2019 - |
سؤال
أقوم ببناء خدمة تُرجع 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>
لا تنتمي إلى StackOverflow