2017-02-23 62 views
0

我正在構建對WebAPI服務調用的響應。默認的XML序列化器大多爲我工作。我需要生成是這樣的:如何在XML序列化運行時(ASP.Net WebApi)中更改XML元素的名稱

<fooCollection> 
    <fooMember> 
    <fooType1> 
     ...bunch of properties for the fooMember 
    </fooType1> 
    </fooMember> 
    <fooMember> 
    <fooType2> 
     ...bunch of properties for the fooMember 
    </fooType2> 
    </fooMember> 
</fooCollection 

我的問題是<fooType>元素是目前在我的模型對象稱爲fooType。根據我的fooMember對象的類型屬性,響應中的元素名稱需要具有不同的名稱。這意味着使用像[DataContract][DataMember]屬性這樣的東西給它一個除對象名以外的名稱似乎不起作用,因爲它們被設置了一次,並且我無法找到如何在運行時更改它。

我的模型代碼看起來是這樣的:

public partial class fooCollection { 
    private fooCollectionMember[] memberField; 

    [System.Xml.Serialization.XmlElementAttribute("fooMember")] 
    public fooCollectionMember[] member { get; set;} 
    } 

    public partial class fooCollectionMember { 
    private fooType fooTypeField; 
    public fooType fooType { get; set } 
    } 

    public partial class fooType { 
    private object fooProperty; 
    // ... more properties 
    public object fooProperty { get; set; } 
    // ... more properties 
    } 

是否有運行/序列化,我可以把我的元素名稱將是什麼爲<fooType>元素中的方法嗎?

另外,有沒有一種方法可以重新排列我的模型,使fooType不是其中一個屬性的對象,而是fooMember對象的屬性以及所有其他屬性,但是當序列化的<fooType>元素被命名爲該屬性的值並封裝其中的其餘屬性?

回答

0

我原來的服務調用get方法是這樣的:

public FooCollection Get() { 
     FooCollection foos = new FooCollection(); 
     // code to fill model 
     return foos; 
    } 

我發現沒有什麼可以讓我拿一個XML元素在是基於FooCollection和更改屬性或對象的答覆中說基於屬性/對象的值,XML響應中的元素名稱。即我不能擁有FooProperty屬性,其XML響應中生成的元素對每個集合項目都有不同的元素名稱。換句話說,如果我使用return-a-model-object-and-let-the-serialization-happen-automatically方法,則此屬性在整個XML文檔中只能有一個元素名稱。但是,我發現了一種解決方法,可以讓我更改元素名稱,但我認爲合適。

我的Get()服務方法不是讓我的Get()服務方法返回FooCollection類型的對象,並在返回後自動序列化,而是返回HttpResponseMessage對象。這樣我可以手動序列化我的模型,然後根據需要操縱它,然後將其作爲HttpResponseMessage返回。

所以,現在我得到服務方法可以看起來更像這個實現我的目標:

public HttpResponseMessage Get() { 
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(FooCollection)); 
    System.IO.StringWriter stringWriter = new System.IO.StringWriter(); 
    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
    FooCollection foos = new FooCollection(); 
    // code to populate FooCollection model, assign namespaces, etc 
    xmlSerializer.Serialize(stringWriter, foos, namespaces); 
    // Now we can manipulate stringWriter value however is needed to replace the element names 
    return new HttpResponseMessage() { 
    Content = new StringContent(stringWriter.ToString(), Encoding.UTF8, "application/xml") 
    }; 
} 
相關問題