2009-12-09 10 views
3

C'est ce que je reçois:Comment obtenir le XMLSerializer pour ajouter des espaces de noms aux attributs dans les objets imbriqués?

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

Voici ce que je veux: (. Notez que le type attribut est préfixé par ex)

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

Ceci est mon code:

[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; } 
    } 
    } 
+0

Aucune de vos exemples sont du XML valide, il n'y a pas de déclaration d'espace de noms ex. –

+0

Ce que vous voulez est faux. Je suggère de prendre une brique à la tête de celui qui a écrit l'autre côté de ce système qui nécessite cette redondance. – Will

+0

@Paul: Désolé, je ne voulais pas exposer les noms d'origine et remplacé les choses et je me suis trompé. – svinto

Répondre

5

IXmlSerializable peut-être?

Remarque J'ai aussi ajouté (à A):

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

est le code ici:

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 
} 
3

par exemple xsd.exe complex.xml xsd.exe gen1.xsd gen2.xsd/c

pas besoin de toucher les fichiers générés xsd (sauf pour remplacer [] [] -> [])

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(); 
} 
+0

Downvoted.Cela l'ajoute à la racine seulement.La question mentionne ajouter préfixe/namespace à des éléments imbriqués spécifiques si je le comprends correctement! – joedotnot

Questions connexes