【问题标题】:ServiceStack Parse Xml Request to DictionaryServiceStack 解析 XML 请求到字典
【发布时间】:2016-03-02 16:26:14
【问题描述】:

我们的一个要求是有一个解耦的架构,我们需要将数据从一个系统映射到另一个系统,中间映射由 ServiceStack 服务请求处理。我们的问题是供应商只能通过 Xml 提供不符合 ServiceStack 提供的标准字典请求的数据,如下所示:

  <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" }
    ...
};

【问题讨论】:

  • 是的。您能否提供一个包含一些条目的 xml 文件。我不能 100% 确定具有多个条目的输入的外观。

标签: c# xml servicestack


【解决方案1】:

默认的 XML 序列化不提供任何可以透明地将 XML 片段推断为字符串字典的方法,因此您需要手动解析 XML,您可以通过实现告诉 ServiceStack to skip built-in Serialization 在 ServieStack 中执行此操作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
         }
    }
}

【讨论】:

  • 我昨天晚上使用了一个非常相似的方法,使用了 RequestStream。很高兴知道我使用了一个好方法。非常感谢!
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多