用LINQ解析肥皂反应

时间:2011-04-16 22:42:54

标签: c# linq parsing soap

我在解析以下soap响应时遇到问题。这是我第一次使用LINQ,我发现必须使用XML而不是SOAP信封。如何获取不同“项目”的值。我知道有不同的选项(使用添加服务引用)但它不是我当前项目中的一个选项。

<SOAP-ENV:Envelope 
xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" 
xmlns:ns1=\"http://random.com/api/1/service\" 
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" 
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" 
xmlns:ns2=\"http://xml.apache.org/xml-soap\" 
xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" 
SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">
   <SOAP-ENV:Body>
       <ns1:getBeatlesResponse>
           <return xsi:type=\"ns2:Map\">
               <item>
                   <key xsi:type=\"xsd:string\">error</key>
                   <value xsi:type=\"xsd:string\">OK</value>
               </item>
               <item>
                   <key xsi:type=\"xsd:string\">Beatles</key>
                   <value xsi:type=\"ns2:Map\">
                       <item>
                           <key xsi:type=\"xsd:int\">9</key>
                           <value xsi:type=\"xsd:string\">John Lennon</value>
                       </item>
                       <item>
                           <key xsi:type=\"xsd:int\">12</key>
                           <value xsi:type=\"xsd:string\">Paul McCartney</value>
                       </item>
                       <item>
                           <key xsi:type=\"xsd:int\">25</key>
                           <value xsi:type=\"xsd:string\">George Harrison</value>
                       </item>
                       <item>
                           <key xsi:type=\"xsd:int\">184</key>
                           <value xsi:type=\"xsd:string\">Ringo Starr</value>
                       </item>
                   </value>
               </item>
           </return>
       </ns1:getBeatlesResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

提前致谢

2 个答案:

答案 0 :(得分:2)

这个非常棘手,因为你有物品可能也有物品......所以如果你做这样的事情

var returnResult = (from r in document.Descendants("item")
                            select r).ToList();

您将获得所有分开的项目和一个具有所有值的项目......

编辑:

这样做有点不错

XDocument document = XDocument.Load(@"XMLFile1.xml");

        List<Item> items = new List<Item>();

        var returnResult = (from r in document.Descendants("item")
                            select r).ToList();

        foreach (XElement xElement in returnResult)
        {

            Item item = new Item();

            item.Key = xElement.Element("key") != null ? xElement.Element("key").Value : "";
            item.Value = xElement.Element("value") != null ? xElement.Element("value").Value : "";

            items.Add(item);
        }

        //sort the list to get the one that have the rest to the end
        var sorted = (from s in items
                      orderby s.Value.Length ascending
                      select s).ToList();

        List<Item> finalList = new List<Item>();

        items.Clear();
        for (int i = 0; i < sorted.Count - 1; i++)
        {
            for (int j = 1; j < sorted.Count; j++)
            {
                if (sorted[j].Value.Contains(sorted[i].Value) &&
                    sorted[j].Value.Length > sorted[i].Value.Length)
                {
                    Item itm = new Item();
                    itm.Key = sorted[j].Key;
                    KeyValuePair<string, string> kvp = new KeyValuePair<string, string>(sorted[i].Key,sorted[i].Value);
                    itm.Items.Add(kvp);
                    items.Add(itm);

                }
                else
                {
                    if (!finalList.Contains(sorted[i]))
                        finalList.Add(sorted[i]);
                }
            }
        }
class Item
{
    public List<Item> Items { get; set; }
    public string Key { get; set; }
    public string Value {get;set;}
    public Item()
    {
        Items = new List<Item>();
    }
}

你现在可以看到所有子项目都有正确的密钥......只有ok / error会出现问题...但你可以从最终列表中获取它们并选择它们,如果它们不是任何密钥 - 价值对......

希望这会有所帮助

答案 1 :(得分:0)

您应该可以通过将其加载到XDocument来解析它。然后,您可以通过指定元素名称来选择所需的值。最后,您可以将这些值作为新的匿名类型返回。可以在对此问题的回复中找到一个示例:Using LINQ to XML to Parse a SOAP message

如果您有任何问题,请告诉我。