2014-12-04 2 views
1

У меня есть объект:Xmlserializer nillable элемент с xmlattribute, возможно?

class Thing { 
    [Xmlarray("Widget", IsNullable=true) ] 
    List<Widget> Widgets; 
} 

class Widget { 
    [Xmlattribute] 
    public string Name; 
    [XmlTextAttribute] 
    public string Value; 
} 

В основном я хочу пример вывода выглядеть следующим образом:

<Thing> 
    <Widget name="foo" xsi:nil="true"/> 
    <Widget name="bar">Nerds</Widget> 
</Thing> 

Проблема я испытываю, что XmlSerializer не делает, что для Foo линии. Он не записывает бит xsi:nil для виджетов, у которых есть Value, содержащий нуль. Это просто пустой элемент (<Widget name="foo"/>

Парсер, который заканчивает употребление этого Xml, является старым, мусором и из-под контроля. Он ожидает, что он будет отсутствовать, если я хочу, чтобы эта запись виджетов удалялась из ее системы/хранилища (это то, что он делает, если нулевой бит отсутствует в пустой записи Widget).

Извините, если есть ошибки, написав их на мобильном телефоне. По сути, как мне получить xmlserializer, чтобы записать бит nil ?

ОБНОВЛЕНИЕ: Вот теги. Я читаю смутные вещи о том, как нельзя установить nillable, если есть атрибут на arrayitem (виджет в списке Widgets).

<Widget xsi:nil="true"/> 

бесполезно для меня, как я упомянул - запись нужно имя атрибута и ноль = истина (она указывает процессору «это поле, удалить его из магазина»). Без атрибута name он не знает, в каком поле. К сожалению, это зависит только от xsi: nil, чтобы сказать это. Если он видит пустой номер <Widget name="foo"/> - он устанавливает его пустым/пустым, а не полностью удаляется.

class Thing{ 
     [System.Xml.Serialization.XmlArrayItemAttribute("Widget", IsNullable=true)] 
     public List<Widget> Widgets { get; set; } 
} 
class Widget{ 
     [System.Xml.Serialization.XmlAttribute][JsonProperty] 
     public string name {get;set;} 
     [System.Xml.Serialization.XmlTextAttribute] 
     public string Value {get;set;} 
} 

По сути, это не может быть <Widget name="foo"><Value>Bar</Value></Widget> или <Widget xsi:nil=true/> или <Widget name="foo"/> - должны быть <Widget name="foo" xsi:nil="true"/> только. Вините процессор, к которому эта вещь отправляется (я не контролирую).

Итак, это сериализуемо?

ответ

2

Я обновляю ответ и снова удаляю код. Реализация IXmlSerializable может работать для этого issue.I только реализовать функцию интерфейса WriteXml, вы можете реализовать другие, если вы need.The код будет изменен, как Belows:

public class Thing:IXmlSerializable 
    {  
     public List<Widget> Widgets{get;set;} 

     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      throw new NotImplementedException(); 
     } 

     public System.Xml.Schema.XmlSchema GetSchema() 
     { 
      throw new NotImplementedException(); 
     } 

     public void ReadXml(System.Xml.XmlReader reader) 
     { 
      throw new NotImplementedException(); 
     } 

     public void WriteXml(System.Xml.XmlWriter writer) 
     { 
      writer.WriteStartElement("xsi","Thing", @"http://www.w3.org/2001/XMLSchema-instance"); 
      foreach (Widget widget in Widgets) 
      { 
       if (string.IsNullOrEmpty(widget.Value)) 
       { 
        writer.WriteStartElement("widget"); 
        writer.WriteAttributeString("Name", widget.Name); 
        writer.WriteAttributeString("xsi", "nil", @"http://www.w3.org/2001/XMLSchema-instance", "true");         
        writer.WriteEndElement(); 
       } 
       else 
       { 
        writer.WriteStartElement("widget"); 
        writer.WriteAttributeString("Name", widget.Name); 
        writer.WriteString(widget.Value); 
        writer.WriteEndElement(); 
       } 
      } 
      writer.WriteEndElement(); 
      writer.Flush(); 
     } 
    } 

    public class Widget 
    { 
     public string Name{get;set;} 
     public string Value { get; set; } 
    } 
} 

public static void SaveXml() 
     { 
      XmlWriterSettings settings= new XmlWriterSettings(); 
      settings.Indent = true; 
      settings.OmitXmlDeclaration = true;     

      XmlWriter xmlWriter = XmlWriter.Create(@"c:\test.xml",settings);   
      thing.WriteXml(xmlWriter); 

     } 

После сериализации XML выглядит как below.widget3-х значение равно null. Надеюсь, это полезно.

<xsi:Thing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <widget Name="name1">widget1</widget> 
     <widget Name="name2">widget2</widget> 
     <widget Name="name3" xsi:nil="true" /> 
    </xsi:Thing> 
+0

Возможно, я неправильно написал атрибут Xmlarray. Это подсказка для сериализации, которая принимает IsNullable. К сожалению, я не могу изменить конечный результат. Он питается дрянным старым и ловким процессором, который не всегда работает правильно. – Jason

+0

Когда я войду в офис и с телефона, я отредактирую сообщение, чтобы он стал более понятным и предоставил ссылку на мою проблему. – Jason

+0

Я обновил сообщение, чтобы включить лучшую информацию. – Jason

Смежные вопросы