代码之家  ›  专栏  ›  技术社区  ›  Svante Svenson

如何让XMLSerializer向嵌套对象中的属性添加名称空间?

  •  3
  • Svante Svenson  · 技术社区  · 15 年前

    这就是我得到的:

    <ex:test soap:mustUnderstand="1" xmlns:ex="http://www.example.com/namespace">
      <ex:A Type="lorem">ipsum</ex:A>
    </ex:test>
    

    这就是我想要的:(注意Type属性的前缀是ex。)

    <ex:test soap:mustUnderstand="1" xmlns:ex="http://www.example.com/namespace">
      <ex:A ex:Type="lorem">ipsum</ex:A>
    </ex:test>
    

      [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; }
        }
      }
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Marc Gravell    15 年前

    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
    }
    
        2
  •  7
  •   neuralsea    13 年前

    e、 g.xsd.exe complex.xml

    无需触摸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();
    }