【问题标题】:Convert XML String API response to a key-value Object C#将 XML 字符串 API 响应转换为键值对象 C#
【发布时间】:2020-12-25 12:08:34
【问题描述】:

我从 API 接收 XML 字符串,并希望将这些转换为 C# 对象键值以处理这些值,同时应用一些断言。

消息的格式为字符串格式:

<?xml version="1.0" encoding="UTF-8"?>
<ReportData>
   <ProjectName>Test Data</ProjectName>
   <Unit>Unit 1</Unit>
   <ReportLabel.Cost>394</ReportLabel.Cost>
</ReportData>

在我得到字符串 API 响应后,我试图像这样反序列化 XMl,其中 responseAPI 是上面的 xml:

XmlDocument doc = new XmlDocument();

            using (var reader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(responseAPI), XmlDictionaryReaderQuotas.Max))
            {
                XElement xml = XElement.Load(reader);
                doc.LoadXml(xml.ToString());
            }

此时我有 xml 但我无法获取键值对象。

我在努力

var jsonText = JsonConvert.SerializeXmlNode(doc);

serializer = new XmlSerializer(typeof(Object));
using (TextReader reader = new StringReader(responseAPI))
{
  var result = (Object)serializer.Deserialize(reader);
}

var response = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseAPI);

我不熟悉这种 XML 响应,但不确定执行此操作的方法。不像 JSON 格式那么简单。

【问题讨论】:

标签: c# xml


【解决方案1】:

您可以使用System.Xml.Linq 执行此任务。
这是从 XML 创建字典的一种方法:

static void Main(string[] args)
{
    // or use other overload of the Load() method if the XML is not comes from a file stream, uri etc...
    var xmldoc = System.Xml.Linq.XDocument.Load("YOUR FILE PATH");

    Dictionary<string, string> XMLKeyval = new Dictionary<string, string>();
    foreach (var name in xmldoc.Descendants("ReportData").Elements()
                        .Select(x => new { Name = x.Name, Value = x.Value }).Distinct())
    {
        XMLKeyval.Add(name.Name.LocalName, name.Value);
    }

    // Output
    foreach (KeyValuePair<string, string> itm in XMLKeyval)
    {
        Console.WriteLine(itm.Key + ": " + itm.Value);
    }

    Console.ReadLine();
}

【讨论】:

    【解决方案2】:

    你不能直接将xml转换为键值对的dict,而是需要遍历xml中的每个节点,并将其作为键值对添加到dict对象中。

    请参考Converting an XML-document to a dictionary

    【讨论】:

    • 我觉得链接的答案回答了这个问题,请将其标记为重复。
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2012-07-11
    • 2011-03-12
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多