从xml中提取内部数据

时间:2017-11-07 16:10:03

标签: c# json xml serialization

我有以下格式的xml数据:

<coll>
    <item>
        <key>description</key>
        <value>one</value>
    </item>
    <item>
        <key>name</key>
        <value>John</value>
    </item>
    <item>
        <key>lastName</key>
        <value>Peter</value>
    </item>
    <item>
        <key>institutionCode</key>
        <value>cliente_test</value>
    </item>
</coll>

我使用以下代码将其转换为json:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

这给了我json值:

{
  "coll": {
    "item": [
      {
        "key": "description",
        "value": "one"
      },
      {
        "key": "name",
        "value": "John"
      },
      {
        "key": "lastName",
        "value": "Peter"
      },
      {
        "key": "institutionCode",
        "value": "cliente_test"
      }
    ]
  }
}

有没有办法从上面的xml:

获取以下格式的json
{
    "description" : "one",
    "name" : "John",
    "lastName" : "Peter",
    "institutionCode" : "cliente_test"
}

或者进入以下c#对象:

public class Data
{
    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("institutionCode")]
    public string InstitutionCode { get; set; }

    [JsonProperty("lastName")]
    public string LastName { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

感谢任何形式的帮助。

2 个答案:

答案 0 :(得分:3)

var xDoc = XDocument.Load(filename);
var dict = xDoc.Descendants("item").ToDictionary(x => (string)x.Element("key"), 
                                                 x => (string)x.Element("value"));

var json = JsonConvert.SerializeObject(dict);

OR

var data = JObject.FromObject(dict).ToObject<Data>();    

答案 1 :(得分:0)

您在XML中拥有的是项目值的集合。这就是为什么它被转换为json中的列表。除了自己实现它之外别无他法,但这不是一项艰巨的任务。你可以将数据读入字典,然后将其转换为json。 做这样的事情

xmldoc.Load(xmlfile);
xmlnode = xmldoc.GetElementsByTagName("item");

dynamic node= new ExpandoObject();
var dictionary = (IDictionary<string, object>)node;
    for (int i = 0; i < xmlnode.Count; i++)
    {
dictionary.Add(xmlnode[i].ChildNodes.Item(0).InnerText, xmlnode[i].ChildNodes.Item(1).InnerText)

}

var json = JsonConvert.SerializeObject(dictionary);