Come posso ottenere il XMLSerializer per aggiungere spazi dei nomi di attributi in oggetti nidificati?

Questo è quello che ottengo:

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

Questo è ciò che voglio: (si noti che il Tipo di attributo è prefissato con la ex.)

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

Questo è il mio codice:

  [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; }
    }
  }
Nessuno dei vostri esempi sono un XML valido, non c’è nessun ex dichiarazione dello spazio dei nomi.
Quello che vuoi è sbagliato. Vorrei suggerire di prendere un mattone alla testa di chi ha scritto l’altro lato di questo sistema, che richiede che la ridondanza.
Mi dispiace, non volevo esporre i nomi originali e sostituiti cose e si è sbagliato.
Sì, lo so, ma è uno di quei momenti in cui non è possibile cambiare le cose all’altra estremità. 🙁

OriginaleL’autore svinto | 2009-12-09

2 risposte

  1. 5

    IXmlSerializable forse?

    Nota ho anche aggiunto (a A):

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

    ecco il codice:

    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
    }

    OriginaleL’autore Marc Gravell

  2. 4

    ad es. xsd.exe complex.xml
    xsd.exe gen1.xsd gen2.xsd /c

    non c’è bisogno di toccare xsd file generati (ad eccezione di sostituire [][] -> [])

    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();
    }
    Downvoted. questo si aggiunge alla radice. la domanda menziona aggiungere il prefisso dello spazio dei nomi specifici elementi nidificati, se sto capendo bene !

    OriginaleL’autore neuralsea

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *