我在解析以下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>
提前致谢
答案 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
如果您有任何问题,请告诉我。