Разбор мыльного ответа с помощью LINQ - PullRequest
0 голосов
/ 17 апреля 2011

У меня проблемы с анализом следующего мыльного ответа. Я впервые работаю с 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 ]

2 голосов
/ 17 апреля 2011

это довольно сложно, потому что у вас есть предметы, у которых есть предметы, которые, вероятно, тоже могут иметь предметы ... так что если вы сделаете что-то вроде этого

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 создает некоторые проблемы ... но вы можете получить их из окончательного списка и выбрать их, если они не являются ключевыми пары значений ...

надеюсь, это поможет

0 голосов
/ 17 апреля 2011

Вы должны быть в состоянии разобрать это, загрузив его в XDocument .Затем вы можете выбрать нужные значения, указав имена элементов.Наконец, вы можете вернуть эти значения как новый анонимный тип.Пример можно найти в ответе на этот вопрос: Использование LINQ to XML для анализа сообщения SOAP

Дайте мне знать, если у вас возникли проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...