2009-12-09 3 views
3

중첩 된 객체의 속성에 네임 스페이스를 추가하도록 XMLSerializer를 얻으려면 어떻게해야합니까?

이것은 내가 얻은 것입니다 :

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

이것은 내가 원하는 것입니다 : (타입 속성은 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; } 
    } 
    } 
+0

의 어느 - xsd.exe complex.xml xsd.exe gen1.xsd gen2.xsd/

(> [] [] []를 대체하는 것을 제외하고) XSD 파일을 생성 할 필요없이 터치 C 당신의 예제는 유효한 XML이고, 네임 스페이스 선언은 없다. –

+0

원하는 것은 잘못되었습니다. 중복을 요구하는이 시스템의 다른면을 작성한 사람의 머리에 벽돌을 가져갈 것을 제안합니다. – Will

+0

@Paul : 죄송합니다. 원래 이름을 공개하고 바꿔 놓기를 원하지 않았습니다. 잘못되었습니다. – svinto

답변

5

IXmlSerializable 어쩌면?

참고 또한 (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 
} 
3

예 : 여기

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

코드입니다

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.이 루트에만 추가합니다. 질문에 대한 접두사/네임 스페이스를 추가하면 특정 중첩 된 요소를 올바르게 이해하고있다! – joedotnot

관련 문제