我向服务发出请求并收到xml响应,如下所示。但是,我正在尝试将响应值存储在Dictionary中(或存储变量中返回的值),而我似乎无法使它工作。
非常感谢任何帮助。
收到xml回复:
<?xml version="1.0"?>
<ncresponse NCERRORPLUS="!" BRAND="ABC" PM="CC" currency="GBP" amount="10" STATUS="9" ACCEPTANCE="test123" NCERROR="0" NCSTATUS="0" PAYID="39409494" orderID="92E5CE91">
</ncresponse>
c#code:
try
{
// Write data
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
// Get response
Dictionary<string, string> respValues = new Dictionary<string, string>();
try
{
string body = String.Empty;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
// Get the response stream
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("iso-8859-1"));
body += reader.ReadToEnd();
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(body);
XmlNodeList list = xmlDoc.GetElementsByTagName("ncresponse");
string xmlResponse = list[0].InnerText;
}
catch (WebException wex)
{
throw;
}
答案 0 :(得分:7)
使用此:
using System.Xml.Linq; // required namespace for linq-to-xml
/* ... get xml into 'body' string */
XDocument doc = XDocument.Parse(body);
将XML文件加载到XDocument
对象中。
然后,您可以使用Linq-to-XML来解析XML和ToDictionary
扩展方法,为XML的每个属性创建一个键/值对:
var output = doc.Element("ncresponse")
.Attributes()
.Select(c => new {
Key = c.Name,
Value = c.Value
})
.ToDictionary(k => k.Key, v => v.Value);
似乎我的事情过于复杂(归功于@KyleW)。这样:
var output = doc.Element("ncresponse")
.Attributes()
.ToDictionary(k => k.Name, v => v.Value);
相当于初始linq查询。只有在需要对字典中的值进行一些预处理时才需要Select
。
输出:
[0] = {[NCERRORPLUS, !]}
[1] = {[BRAND, ABC]}
[2] = {[PM, CC]}
... etc
答案 1 :(得分:1)
我需要解决类似的问题,但我的问题有点复杂。 XML文档可以包含任意数量的子集合和集合中的集合。每个节点都保证具有唯一的名称。我使用以下代码将其放入字典中。递归函数用于将每个XElement解析为字典,或解析它可能具有的任何子元素。
private static void RecParseXDoc(XElement element, Dictionary<string, string> xDict)
{
if (element.HasElements)
{
foreach (var childElement in element.Elements())
{
RecParseXDoc(childElement, xDict);
}
}
xDict.Add(element.Name.ToString(), element.Value);
}
然后我们可以像这样启动解析:
var outputDict = new Dictionary<string, string>();
foreach (var element in xDoc.Root.Elements())
{
RecParseXDoc(element, outputDict);
}
如果您的XML可能具有重复的节点名称,则可以在将该元素添加到字典之前执行.TryGetValue。
我在这里留下这个答案,其他有孩子元素问题的人会发现你的问题。