2011-11-25 193 views
2

我有这个类C#XML序列化属性

public class dtoObject : CommonBase 
{ 
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")] 
    public List<dtoSomeItem> SomeItems 
    { 
     get { return _SomeItems; } 
     set { _SomeItems = value; } 
    } 
} 

,我也想用XML序列化,使XML字符串似乎是:

<Objects> 
    <Object> 
     <SomeItems> 
      <SomeItem> 
       1 
      </SomeItem> 
      <SomeItem> 
       2 
      </SomeItem> 
     </SomeItems> 
    </Object> 
    <Object> 
     <SomeItems> 
      <SomeItem> 
       3 
      </SomeItem> 
      <SomeItem> 
       4 
      </SomeItem> 
     </SomeItems> 
    </Object> 
</Objects> 

但对于生活我的我无法弄清楚如何在属性方面之前

public class dtoObject 

说,让我得到

<Objects><Object>...</Object><Object>... 

当我序列化这个。

任何想法?

回答

1

这是我的工作。感谢comptent_tech和dthorpe的帮助。我建立了我的DTO像这样:

[XmlType("Object", Namespace = "", TypeName = "Object")] 
public class dtoObject : CommonBase 
{  
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]  
    public List<dtoSomeItem> SomeItems  
    { 
     get { return _SomeItems; }   
     set { _SomeItems = value; }  
    }  
} 

我的函数,它的序列化是这样的:

public string ToXML(List<dtoObject> oObject) 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    XmlSerializer xmlSerializer = new XmlSerializer(oObject.GetType(), new XmlRootAttribute("Objects")); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 

    using (MemoryStream xmlStream = new MemoryStream()) 
    { 

     xmlSerializer.Serialize(xmlStream, oObject, ns); 

     xmlStream.Position = 0; 
     xmlDoc.Load(xmlStream); 
     return xmlDoc.InnerXml; 
    } 
} 

这样做创建的XML格式:

<?xml version="1.0"?> 
    <Objects> 
     <Object> 
      <SomeItems> 
       <SomeItem> 
       </SomeItem> 
      </SomeItems> 
     </Object> 
    <Objects>  
0

在类声明前需要类似XmlRootAttribute("Object", Namespace="", IsNullable=false)的东西。这告诉XML序列化程序使用<Object>标记来表示XML文本中的dtoObject。

至于<Objects>标记,除非序列化dtoObject数组,否则不会得到该标记。这超出了dtoObject类型的范围。

+0

dthorpe,谢谢大家了回复,但是当我添加属性像你建议给我的dtoObject类,xml被写入这样的字符串:<?xml version =“1.0”?> ... – Jason

+0

你如何序列化对象到XML?你在使用System.Xml.Serialization.XmlSerializer.Save()吗? – dthorpe

+0

我正在向此函数传递'List '公共字符串ToXML(Object oObject){XmlDocument xmlDoc = new XmlDocument(); XmlSerializer xmlSerializer = new XmlSerializer(oObject.GetType());使用(MemoryStream xmlStream =新的MemoryStream()){xmlSerializer.Serialize(xmlStream,oObject); xmlStream.Position = 0; xmlDoc.Load(xmlStream);返回xmlDoc.InnerXml; }}' – Jason

1

我不认为你可以用你的对象结构来做到这一点,因为XML有效地声明了SomeItems集合的包装器。例如:

[XmlType("Objects")] 
public class dtoObject : CommonBase 
{ 
    [XmlElement("Object")] 
    public List<dtoSomeItemWrapper> SomeItemsWrappers 
    { 
     get { return _SomeItemsWrappers; } 
     set { _SomeItemsWrappers = value; } 
    } 
} 

class dtoSomeItemWrapper 
{ 
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")] 
    public List<dtoSomeItem> SomeItems 
    { 
     get { return _SomeItems; } 
     set { _SomeItems = value; } 
    } 
} 
+0

comptent_tech我很欣赏这个回复,但是生成的xml字符串就像这样:<?xml version =“1.0”?>' – Jason

+0

@ user1066353:好的,更新答案,以便它应该生成你所需要的。 –