如何让XMLSerializer将命名空间添加到嵌套对象中的属性?

这就是我得到的:

 ipsum  

这就是我想要的:(注意Type-attribute以ex为前缀)

  ipsum  

这是我的代码:

  [XmlType(Namespace = "http://www.example.com/namespace")] [XmlRoot("ex", Namespace = "http://www.example.com/namespace")] public class TestSoapHeader : SoapHeader { private TestSoapHeaderTypeValuePair _a; public TestHeader() { MustUnderstand = true; } [XmlNamespaceDeclarations] public XmlSerializerNamespaces xmlsn { get { XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); xsn.Add("ex", "http://www.example.com/namespace"); return xsn; } set { } } public TestSoapHeaderTypeValuePair A { get { return _a; } set { _a = value; } } } [XmlType(Namespace = "http://www.example.com/namespace")] public class TestSoapHeaderTypeValuePair { private string _type; private string _value; [XmlNamespaceDeclarations] public XmlSerializerNamespaces xmlsn { get { XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); xsn.Add("ex", "http://www.example.com/namespace"); return xsn; } set { } } public TestSoapHeaderTypeValuePair(string type, string value) { Type = type; Value = value; } public TestSoapHeaderTypeValuePair() {} [System.Xml.Serialization.XmlAttributeAttribute("type", Namespace = "http://www.example.com/namespace")] public string Type { get { return _type; } set { _type = value; } } [System.Xml.Serialization.XmlText()] public string Value { get { return _value; } set { _value = value; } } } 

IXmlSerializable可能吗?

注意我也添加了(到A ):

 [XmlElement("A", Namespace = "http://www.example.com/namespace")] public TestSoapHeaderTypeValuePair A {...} 

这是代码:

 public class TestSoapHeaderTypeValuePair : IXmlSerializable { private string _type; private string _value; public TestSoapHeaderTypeValuePair(string type, string value) { Type = type; Value = value; } public TestSoapHeaderTypeValuePair() { } public string Type { get { return _type; } set { _type = value; } } public string Value { get { return _value; } set { _value = value; } } #region IXmlSerializable Members System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) { throw new NotImplementedException(); } void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) { writer.WriteAttributeString("ex", "type", "http://www.example.com/namespace", Type); writer.WriteString(Value); } #endregion } 

例如xsd.exe complex.xml xsd.exe gen1.xsd gen2.xsd / c

无需触摸xsd生成的文件(除了替换[] [] – > [])

 XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("dfs", "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution"); ns.Add("d", "http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields"); ns.Add("pc", "http://schemas.microsoft.com/office/infopath/2007/PartnerControls"); XmlSerializer serializer = new XmlSerializer(typeof(myFields)); StringBuilder sb = new StringBuilder(); using (StringWriter writer = new StringWriter(sb)) { serializer.Serialize(writer, myFields, ns); return sb.ToString(); }