2016-12-02 65 views
0

我有一个奇怪的XML设置在这里:我需要一个第三方及其XML布局,他们正在使用的接口是超出了我的控制 - 没有机会改变什么...C# - XML序列化:在我的XML输出省略某个元素

在更大的XML的范围,我觉得自己需要序列化(后来还反序列化),这被定义为具有TypeNumber属性的项目的列表(移动设备) (两个字符串)。因此,这将是这样的:

public class SerialNumber 
{ 
    public string Type { get; set; } 
    public string Number { get; set; } 
} 

,这将通常序列化List<SerialNumber> SerialNumbers作为

<SerialNumbers> 
    <SerialNumber> 
     <Type>SN</Type> 
     <Number>CBS583ABC123</Number> 
    </SerialNumber> 
    <SerialNumber> 
     <Type>IMEI</Type> 
     <Number>35-924106-659945-4</Number> 
    </SerialNumber> 
</SerialNumbers>   

然而,在我的情况,我需要发送此XML:

<SerialNumbers> 
    <Type>SN</Type> 
    <Number>CBS583ABC123</Number> 
    <Type>IMEI</Type> 
    <Number>35-924106-659945-4</Number> 
</SerialNumbers>   

所以基本上,这个列表元素需要省略 - 我只需要一个容器<SerialNumbers>然后对于li中的每个条目st,我只需要序列化出TypeNumber子元素。

我怎么能与XmlSerializer .NET这样做容易吗?

我试图用

[XmlRoot(ElementName="")] 
public class SerialNumber 

[XmlArray] 
[XmlArrayItem(ElementName = "")] 
public List<SerialNumber> SerialNumbers { get; set; } 

但既不是这些工作的 - 我仍然得到我的系列化与<SerialNumbers>容器内的<SerialNumber>元素...

有没有一个简单的伎俩来实现我在找什么?我宁愿不是去低级别,并开始一起手动我的XML一起conceilating ....

谢谢!

+0

有一个解决方案在这里:与RestSharp的Xml序列反序列化(http://stackoverflow.com/a/32885108/3744182 )。问题是用于restsharp,但答案使用'XmlSerializer'。 – dbc

回答

2

你可以使用自定义序列化与IXmlSerializable的。

public class SerialNumbers : List<SerialNumber>, IXmlSerializable 
{ 
    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     Clear(); 
     reader.ReadStartElement(); 
     while (reader.NodeType != XmlNodeType.EndElement) 
     { 
      var serialNumber = new SerialNumber 
      { 
       Type = reader.ReadElementContentAsString("Type", ""), 
       Number = reader.ReadElementContentAsString("Number", "") 
      }; 
      Add(serialNumber); 
     } 
     reader.ReadEndElement(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     foreach (var serialNumber in this) 
     { 
      writer.WriteElementString("Type", serialNumber.Type); 
      writer.WriteElementString("Number", serialNumber.Number); 
     } 
    } 
} 

public class SerialNumber 
{ 
    public string Type { get; set; } 
    public string Number { get; set; } 
} 

实施例:

var ser = new XmlSerializer(typeof(SerialNumbers)); 

var reader = new StringReader(@" 
    <SerialNumbers> 
     <Type>SN</Type> 
     <Number>CBS583ABC123</Number> 
     <Type>IMEI</Type> 
     <Number>35-924106-659945-4</Number> 
    </SerialNumbers> 
".Trim()); 
var result = (SerialNumbers) ser.Deserialize(reader); 

var writer = new StringWriter(); 
ser.Serialize(writer, result); 

结果:

<?xml version="1.0" encoding="utf-16"?> 
<SerialNumbers> 
    <Type>SN</Type> 
    <Number>CBS583ABC123</Number> 
    <Type>IMEI</Type> 
    <Number>35-924106-659945-4</Number> 
</SerialNumbers> 
0

这可能做的伎俩为您

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class SerialNumbers 
{ 
    private string[] itemsField; 
    private ItemsChoiceType[] itemsElementNameField; 
    [System.Xml.Serialization.XmlElementAttribute("Number", typeof(string))] 
    [System.Xml.Serialization.XmlElementAttribute("Type", typeof(string))] 
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")] 
    public string[] Items 
    { 
     get 
     { 
      return this.itemsField; 
     } 
     set 
     { 
      this.itemsField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlElementAttribute("ItemsElementName")] 
    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public ItemsChoiceType[] ItemsElementName 
    { 
     get 
     { 
      return this.itemsElementNameField; 
     } 
     set 
     { 
      this.itemsElementNameField = value; 
     } 
    } 
} 

[System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema = false)] 
public enum ItemsChoiceType 
{ 
    Number, 
    Type, 
} 
+0

对不起,这不起作用 - 尝试序列化这个时,我总是收到“反射错误”...... –