2010-11-08 32 views
1

我想解析來自OData REST服務的響應。當響應採用JSON格式時,使用WCF REST入門套件中的ReadAsJsonDataContract方法很容易。但是,如果響應是Atom提要,情況似乎更復雜。這是一個例子:如何從OData Atom提要反序列化對象?

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> 
<entry xml:base="http://localhost:64172/BookshopService.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> 
    <id>http://localhost:64172/BookshopService.svc/Books(89)</id> 
    <title type="text"></title> 
    <updated>2010-11-08T09:44:21Z</updated> 
    <author> 
    <name /> 
    </author> 
    <link rel="edit" title="Books" href="Books(89)" /> 
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/OrderLines" type="application/atom+xml;type=feed" title="OrderLines" href="Books(89)/OrderLines" /> 
    <category term="BookshopModel.Books" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> 
    <content type="application/xml"> 
    <m:properties> 
     <d:Id m:type="Edm.Int32">89</d:Id> 
     <d:Author>Martin Fowler</d:Author> 
     <d:Title>Analysis Patterns</d:Title> 
     <d:Price m:type="Edm.Decimal">50.20</d:Price> 
    </m:properties> 
    </content> 
</entry> 

所以實際物體在序列「內容/米:屬性」元素。當然這不能由DataContractSerializer處理,它需要不同的模式。

有誰知道什麼技術可以用來反序列化OData atom m:properties元素的內容嗎?

回答

3

WCF數據服務有一個客戶端,它可以用來消費響應,並從這些客戶端實現CLR對象。看看System.Data.Services.Client.DataServiceContext類和所有相關的類。 事實上,在VS中,您可以將「添加服務參考」添加到您的OData服務,並且它將生成服務的客戶端類以及來自DataServiceContext的派生類供您使用。 如果您已擁有客戶端類,則可以使用DataServiceContext.Execute<T>方法發出任何查詢並將其結果實現爲客戶端類型。

+0

Vitek,謝謝你的回答。我有一個服務引用到我的OData服務,並且它對LINQ非常適用,所以我甚至不需要在我的應用程序中手動使用DataContractSerializer。所以這主要是爲了我的好奇心:如果我想完全控制並從JSON或AtomPub負載反序列化對象,我該怎麼做?我設法用JSON實現它,但Atom提要似乎更加棘手,因爲它不使用原始模式。也許有沒有簡單的方法來重建對象從這種飼料沒有通過每個單獨的領域? – 2010-11-08 14:57:00

+0

我明白了,目前我還沒有意識到使用ATOM有效載荷實現這一點的簡單方法。客戶端庫實現者有時很接近,但它確實帶來的可能比您想要的更復雜。因此,如果您真的需要這樣做,那麼基於某些XML解析庫(XLinq很容易)的自定義解析器是您的最佳選擇。 – 2010-11-08 15:42:36

+0

我明白了。然後我想我會堅持使用標準選項:使用LINQ或Json。 – 2010-11-08 16:04:47