2008-11-20 16 views

cevap

5

XmlSerializer'ın sıfırlamak için nil = "true" değerini bir ad alanıyla önek eklemeniz gerektiğini düşünüyorum.

MSDN on xsi:nil

<?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"/> 
+0

Teşekkürler Phil, bu işe yaradı. Şimdi sadece ad alanı eklemek için mesajları veren adam almam gerekiyor ... –

+0

Endişeye gerek yok SCOA :-P Eğer XML'i kaynağında değiştiremiyorsan (sesini değiştirebiliyorsan) bir XSLT dönüşümünden geçebilirsin. ad alanı eklemek için ... –

+0

Evet JENP, 'to_xml' ile xml üreten bir Rails uygulaması olduğu için bunu kaynakta yapmak zor. Ayrıca, xsi: type özniteliğine, .NET'in var olmayan "array" adlı bir tür için bakmasını sağlar. Nihayetinde 'NullableInt' tipimle yapışmak daha kolay olacak. –

3

Benim düzeltme öncesi süreç için düğümleri, nitelikleri herhangi bir "nil" sabitleme geçerli: için böylece çocuk düğümler için özyinelemeli arama ile

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); 
} 

ben çift bu, Herhangi bir XmlNode (veya XmlDocument), ben serileştirmeden önce tek bir çağrı yayınlayabilirim. Orijinal bellek içi yapıyı değiştirilmeden tutmak istiyorsanız, XmlNode'un bir Clone() ile çalışın.

+0

Bu benim için çok iyi çalıştı, teşekkürler. Ve Rails tüketimi için açıkça. Boş olmayan öznitelikleri kontrol etmek için hafif bir ayarlama yaptım: XmlAttribute nilAttribute = null; if (@ this.Attributes! = Null) nilAttribute = @ this.Attributes ["nil"]; } – Dylan

0

Bunu yapmak için son derece tembel bir yol. Birtakım nedenlerden dolayı kırılgan ama benim XML'im bu kadar hızlı ve kirli bir düzeltme gerektirecek kadar basit.

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\""); 
İlgili konular