2016-03-01 56 views
2

我們的一個要求是有一個解耦架構,我們需要將數據從一個系統映射到另一個系統,而中間映射由ServiceStack服務請求處理。我們的問題是,供應商只能提供通過XML不符合該ServiceStack提供像下面的標準字典請求數據:ServiceStack解析XML請求到字典

<Lead xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <d2p1:KeyValueOfstringstring> 
     <d2p1:Key>String</d2p1:Key> 
     <d2p1:Value>String</d2p1:Value> 
    </d2p1:KeyValueOfstringstring> 
    </Lead> 

相反,他們需要像一個機制:

<Lead> 
    <LeadId>Value</LeadId> 
    <FirstName>First Name</FirstName> 
    <LastName>Last Name</LastName> 
    ... 
</Lead> 

由於他們的xml請求中的節點可能會隨時間而改變,而我們只是充當中間人,是否有一種本地方式來接受動態請求或將其作爲具有類似於下面的數據的字典來處理?

Dictionary<string, string> 
{ 
    { "LeadId", "Value" }, 
    { "FirstName", "First Name" }, 
    { "LastName", "Last Name" } 
    ... 
}; 
+0

是的。你能提供一個帶有幾個條目的XML文件嗎?我不是100%確定具有多個條目的輸入的外觀。 – jdweng

回答

2

默認XML序列化不提供任何方式,你可以透明地推斷出一個XML片段到一個字符串字典,以便你將需要手動分析,你可以告訴ServiceStack to skip built-in Serialization在ServieStack做XML通過實施IRequiresRequestStream這ServiceStack將與請求流注入,所以你可以自己反序列化,如:

public class Lead : IRequiresRequestStream 
{ 
    public Stream RequestStream { get; set; } 
} 

在服務你,然後手工解析原始的XML並將其轉換成你想要的,如數據收集:

public class RawServices : Service 
{ 
    public object Any(Lead request) 
    { 
     var xml = request.RequestStream.ReadFully().FromUtf8Bytes(); 

     var map = new Dictionary<string, string>(); 
     var rootEl = (XElement)XDocument.Parse(xml).FirstNode; 

     foreach (var node in rootEl.Nodes()) 
     { 
      var el = node as XElement; 
      if (el == null) continue; 
      map[el.Name.LocalName] = el.Value; 
     } 

     return new LeadResponse { 
      Results = map 
     } 
    } 
} 
+1

昨天晚上我使用了一個非常類似的方法,晚上使用RequestStream。很高興知道我正在使用一種好方法。非常感謝你! – DevTech