يمكن XmlSerializer إلغاء تسلسل إلى قيم الفارغة <كثافة>؟
-
08-07-2019 - |
سؤال
وأردت إلغاء تسلسل رسالة XML يحتوي على العناصر التي يمكن أن تكون علامة nil="true"
في فئة مع خاصية من نوع int?
. وكانت الطريقة الوحيدة التي يمكنني أن أحصل عليه للعمل لكتابة بلدي نوع NullableInt
الذي ينفذ IXmlSerializable
. هل هناك طريقة أفضل للقيام بذلك؟
ولقد كتبت عن المشكلة كاملة والطريقة I حلها <لأ href = "http://alexscordellis.blogspot.com/2008/11/using-xmlserializer-to-deserialize-into.html" يختلط = "نوفولو noreferrer "> على بلدي بلوق .
المحلول
وأعتقد أنك تحتاج إلى بادئة صفر = "صحيح" مع مساحة من أجل XmlSerializer إجراء deserialise فارغة.
<?xml version="1.0" encoding="UTF-8"?>
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="array">
<entity>
<id xsi:type="integer">1</id>
<name>Foo</name>
<parent-id xsi:type="integer" xsi:nil="true"/>
نصائح أخرى
وبلدي الإصلاح إلى ما قبل عملية العقد، وتحديد أي "شيء" الصفات:
public static void FixNilAttributeName(this XmlNode @this)
{
XmlAttribute nilAttribute = @this.Attributes["nil"];
if (nilAttribute == null)
{
return;
}
XmlAttribute newNil = @this.OwnerDocument.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance");
newNil.Value = nilAttribute.Value;
@this.Attributes.Remove(nilAttribute);
@this.Attributes.Append(newNil);
}
وأنا زوجين هذا مع بحث العودية لالعقد التابعة، بحيث لأي XmlNode معين (أو XmlDocument)، ويمكنني أن يصدر مكالمة واحدة قبل إلغاء التسلسل. إذا كنت ترغب في الاحتفاظ الأصلي هيكل في الذاكرة معدلة، والعمل مع استنساخ () من XmlNode.
والطريقة البطيئة للغاية للقيام بذلك. انها الهش لعدد من الأسباب ولكن لي XML بسيط بما يكفي لتبرير مثل هذا حل سريع وقذرة.
xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");