2011-05-04 27 views
0

我使用內置的XML反序列化(不是因爲它是我的選擇,而是遺留代碼)將xml反序列化爲強類型對象。使用C#中的內置xml反序列化從外部API反序列化xml時的重複值

注:我有過XML無法控制,它是一個外部API

的問題是一個XML節點已經擴展到包括同名的子節點,它打破了系列化。

例如,XML如下:

<people> 
    <person> 
    <id>1234</id> 
    <person> 
     <name>This is my name</name> 
    <person> 
    </person> 
</people> 

隨着下列對象

[XmlType("person")] 
public class Person { 

    [XmlElement("id")] 
    public int Id { get; set; } 

    [XmlElement("person")] 
    public PersonTitle Title{ get; set; } 
} 

[XmlType("person")] 
pulic class PersonTitle 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 
} 

這被調用(T)xmlserializer.Deserialize(流)時引發錯誤由於即使xml有效,重複的名稱也是如此。就我個人而言,當手動反序列化更容易維護時(特別是當它永遠不會被序列化爲.net時),我不會在複製對象中的xml佈局時自動反序列化它。

但是,我想知道是否有辦法解決這個問題,即使這意味着將子對象展開。

我知道這是不行的,但作爲例子:

[XmlType("person")] 
public class Person { 

    [XmlElement("id")] 
    public int Id { get; set; } 

    [XmlElement("person/name")] 
    public string Title{ get; set; } 
} 

任何幫助表示讚賞。

回答

2

最簡單的方法可能是在反序列化之前通過XSLT轉換運行它 - 匹配person/person/name元素並僅輸出person/name部分。然後反序列化結果。

這裏有一個SO張貼在C#中應用XSLT:How to apply an XSLT Stylesheet in C#

這裏是一個使用XSLT來代替元素:http://cvalcarcel.wordpress.com/2008/09/06/replacing-arbitrary-xml-located-within-an-xml-document-using-xslt/

+0

好的,所以真的沒有辦法繞過反序列化器堅持要將子元素唯一地命名爲父元素嗎? – Gats 2011-05-04 03:43:05

+1

不是以我的經驗,但我已被證明錯誤! – 2011-05-04 03:49:07

+1

雖然我懷疑它是可能的,但可以將名稱屬性和適當歸因的NestedPerson屬性添加到person類,並使所有屬性在語義上可選。這可能會誘使XmlSerializer創建一個具有所有其他屬性的外部人員實例,而另一個人員實例則只使用名稱屬性集合的NestedPerson屬性。但是這看起來更像是一種黑客而不是XSLT預處理器。 – 2011-05-04 03:53:09

0

在最糟糕的情況下,您可以編寫類,但不管您喜歡(不要因爲序列化而妥協),然後實現IXmlSerializable。如果你喜歡,實現ReadXml,爲WriteXml拋出NotImplementedException。

+0

它被寫入到匹配的XML發送給我們。問題是XmlSerializer不喜歡父元素和子元素共享「person」的XmlElement。只是想知道是否有解決辦法比重寫那裏的解析更快。這是一個非常複雜的休息界面,需要幾天的時間來重寫。 – Gats 2011-05-04 03:25:30