SORU
18 AĞUSTOS 2009, Salı


Kaldırmada boş xml null int özelliği XmlSerializer kullanarak öznitelik değeri

3. parti bir xml alıyorum ve C içine serisini istiyorum# nesne. Bu xml değeri tamsayı türü veya boş değeri olan öznitelikleri olabilir: çeki=”11” veya ot=””. Null tamsayı tür özelliği bu öznitelik değeri serisini istiyorum. Ama XmlSerializer null türleri içine kaldırması desteklemiyor. Aşağıdaki test kodu InvalidOperationException ile XmlSerializer oluşturma sırasında başarısız {"type 'TestConsoleApplication.yansıtan bir hata oluştu'."}. SerializeMe

[XmlRoot("root")]
public class SerializeMe
{
    [XmlElement("element")]
    public Element Element { get; set; }
}

public class Element
{
    [XmlAttribute("attr")]
    public int? Value { get; set; }
}

class Program {
    static void Main(string[] args) {
        string xml = "<root><element attr=''>valE</element></root>";
        var deserializer = new XmlSerializer(typeof(SerializeMe));
        Stream xmlStream = new MemoryStream(Encoding.ASCII.GetBytes(xml));
        var result = (SerializeMe)deserializer.Deserialize(xmlStream);
    }
}

"Değer" int, kaldırma özelliğini InvalidOperationException başarısız: . türü değiştirdiğimde

XML document (1, 16) bir hata var.

Herkes aynı anda null olabilecek tür boş değer (null) ile öznitelik tamsayı olmayan boş bir öznitelik değeri kaldırmada serisini nasıl tavsiyelerde bulunabilir? Bunun için herhangi bir hile her alan seri kaldırma işlemi el ile yapmak zorunda kaldı (aslında onları bir yeri vardır) var mı?

Ahsteele yorum sonra güncelleme:

  1. Xsi:nil attribute

    Bildiğim kadarıyla, bu XmlElementAttribute özniteliği - bu özniteliği öğesi hiçbir içerik, ister alt öğe veya gövde metni olduğunu belirtir ile çalışır. Ama XmlAttributeAttribute için çözüm bulmam lazım. Zaten kontrol edemiyorum çünkü değiştirmek xml edemem.

  2. bool *Specified property

    Bu özellik öznitelik değeri olmayan boş olduğunda veya öznitelik eksik. Çeki boş değere sahip olduğunda (ot=") XmlSerializer başarısız yapıcı (beklendiği gibi).

    public class Element
    {
        [XmlAttribute("attr")]
        public int Value { get; set; }
    
        [XmlIgnore]
        public bool ValueSpecified;
    }
    
  3. Custom Nullable class like in this blog post by Alex Scordellis

    Benim sorunum bu blog yazısı sınıf benimsemeye çalıştım:

    [XmlAttribute("attr")]
    public NullableInt Value { get; set; } 
    

    Ama XmlSerializer yapıcı InvalidOperationException başarısız:

    'Value' türü TestConsoleApplication.üyesi edemez hale Nullableİnt.

    XmlAttribute/tür IXmlSerializable uygulama kodlamak için kullanılamaz İşleminin }

  4. Çirkin vekil çözüm (burada kod :) yazdım bana yazıklar olsun ):

    public class Element
    {
        [XmlAttribute("attr")]
        public string SetValue { get; set; }
    
        public int? GetValue()
        {
            if ( string.IsNullOrEmpty(SetValue) || SetValue.Trim().Length <= 0 )
                return null;
    
            int result;
            if (int.TryParse(SetValue, out result))
                return result;
    
            return null;
        }
    }
    

    Ama tüketiciler için sınıf arabirimi kırıyor çünkü böyle bir çözüm istemiyorum. Daha iyi elle IXmlSerializable arabirimini uygulamak istiyorum.

Şu anda bütün Element sınıf (büyük) IXmlSerializable uygulamak için var ve basit bir çözüm yok gibi gözüküyor

CEVAP
25 EYLÜL 2009, Cuma


Bu çalışması gerekir:

[XmlIgnore]
public int? Age { get; set; }

[XmlElement("Age")]
public string AgeAsText
{
  get { return (Age.HasValue) ? Age.ToString() : null; } 
  set { Age = !string.IsNullOrEmpty(value) ? int.Parse(value) : default(int?); }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • Justin Davis

    Justin Davis

    14 Ocak 2008
  • SPBedition

    SPBedition

    24 HAZİRAN 2013