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

svi*_*nto 4 .net c# attributes nested xml-serialization

这就是我得到的:

<ex:test soap:mustUnderstand="1" xmlns:ex="http://www.example.com/namespace">
  <ex:A Type="lorem">ipsum</ex:A>
</ex:test>
Run Code Online (Sandbox Code Playgroud)

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

<ex:test soap:mustUnderstand="1" xmlns:ex="http://www.example.com/namespace">
  <ex:A ex:Type="lorem">ipsum</ex:A>
</ex:test>
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

  [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; }
    }
  }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

IXmlSerializable 也许?

注意我还添加了(to A):

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

这是代码:

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
}
Run Code Online (Sandbox Code Playgroud)


neu*_*sea 5

例如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();
}
Run Code Online (Sandbox Code Playgroud)

  • 投反对票。这仅将其添加到根。如果我理解正确,问题提到为特定的嵌套元素添加前缀/命名空间! (3认同)