将 Xml 个文档转换为 C# 字典

Convert Xml document to C# Dictionary

我向服务发出请求并收到 xml 响应,如下所示。但是,我试图将响应值存储在字典中(或将返回的值存储在变量中),但我似乎无法让它工作。

如有任何帮助,我们将不胜感激。

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#代码:

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

使用这个:

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 扩展方法,为 [=31] 的每个属性创建一个键/值对=]:

 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

我需要解决类似的问题,但我的问题有点复杂。 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。

我把这个答案留在这里,希望其他有子元素问题的人能找到您的问题。