在反序列化XML或访问父节点中的数据时删除不必要的嵌套?

时间:2017-12-04 15:45:27

标签: c# xml

我尝试反序列化的XML有很多字段,这些字段将数据嵌套在子字段中,我想将这些数据分配到类的父属性中,而不是创建其他不需要的结构

<?xml version="1.0" encoding="UTF-8"?>
<x:EventRecord eventid="EVR-1000">
  <x:Postcode>
    <x:ID>ABC123</x:ID>
  </x:Postcode>
</x:EventRecord>

我创建了一个带有Postcode字符串属性的EventRecord类:

public class EventRecord
{
  public string EventID { get; set; }
  public string Postcode { get; set; }
}

是否有可以装饰属性的属性可以告诉反序列化器从嵌套的ID字段中取出值?除了<x:Postcode>之外,<x:ID>中永远不会有任何其他字段。

还有办法将父eventid节点上的x:EventRecord XML属性分配给自己内的EventID属性吗?

1 个答案:

答案 0 :(得分:0)

使用以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:x="abc">
<x:EventRecord eventid="EVR-1000">
  <x:Postcode>
    <x:ID>ABC123</x:ID>
  </x:Postcode>
</x:EventRecord>
</root>

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication16
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XNamespace ns = doc.Root.GetNamespaceOfPrefix("x");

            EventRecord record = doc.Descendants(ns + "EventRecord").Select(x => new EventRecord() {
                EventID = (string)x.Attribute("eventid"),
                Postcode = (string)x.Descendants(ns + "ID").FirstOrDefault()
            }).FirstOrDefault();

        }
    }
    public class EventRecord
    {
        public string EventID { get; set; }
        public string Postcode { get; set; }
    }
}