2013-03-12 185 views
0

我序列化类像下面添加根元素属性

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
namespaces.Add(string.Empty, string.Empty); 
StringWriter sw = new StringWriter(); 
XmlSerializer serializer1 = new XmlSerializer(typeof(List<student>), new XmlRootAttribute("Response")); 
XmlTextWriter xmlWriter = new XmlTextWriter(sw); 
serializer1.Serialize(xmlWriter, ls, namespaces); 
sw.ToString() 

结果字符串下面

<?xml version="1.0" encoding="utf-16"?> 
<Response><student><name>xxx</name></student></Response> 

但是,我怎么能一个属性添加到根元素(响应)? 像下面一个

<?xml version="1.0" encoding="utf-16"?> 
<Response status="1"><student><name>xxx</name></student></Response> 
+0

哪里是'1'取自?它总是'1'吗? – MarcinJuraszek 2013-03-12 09:36:03

+0

并不总是1.它可能是1或0.我设置1如果没有错误其他0 – balaji 2013-03-12 09:39:04

回答

3

你只需要标记与XmlAttribute类的那个属性,即

class MyClass{ 
[XmlAttribute("status")] 
public string ErrorStatus { get; set; } 
} 

编辑:

刚刚意识到你是直接序列化的列表。把你的列表放入一个父类Response中,并将上面的属性添加到这个Response类,然后将Response对象序列化。

希望这会有所帮助。

+0

哪个类?你的意思是学生? – balaji 2013-03-12 09:54:27

+0

对不起,没有工作。它将工作,如果删除命名空间?并且我正在修改根元素。 – balaji 2013-03-12 10:36:47

+0

它是如何工作,抛出错误或不是你所期望的?命名空间应该不重要 – RobJohnson 2013-03-12 11:58:17

1

您可以创建另一个包含该列表的对象,然后创建一个属性以将该属性添加到根节点。

诀窍是在这个新类的前面添加对Student类型的显式类型赋值,以避免让列表嵌套在另一个父节点中。然后

[XmlType(TypeName = "Response")]  
public class ResponseObject 
{ 
    [XmlAttribute("status")]   
    public string file { get; set; } 

    [XmlElement("Student", Type = typeof(Student))] 
    public List<Student> studentList { get; set; } 
} 

您的代码看起来像下面

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
namespaces.Add(string.Empty, string.Empty); 
StringWriter sw = new StringWriter(); 
XmlSerializer serializer1 = new XmlSerializer(typeof(ResponseObject)); 
XmlTextWriter xmlWriter = new XmlTextWriter(sw); 

//Creating new object and assign the existing list and status 
ResponseObject resp = new ResponseObject(); 
resp.studentList = ls; 
resp.status = 1; 

//Serialize with the new object 
serializer1.Serialize(xmlWriter, resp, namespaces); 
sw.ToString()