将XML的一部分绑定为dataSource

时间:2018-09-17 10:15:03

标签: c# xml linq

我有一个类似于下面的 XML С#项目中的一个列表,这些列表必须部分地根据子名称绑定到该XML,使用数据名称作为DisplayMember并数据值作为ValueMember。

我的问题是:如何使用 LINQ ,通过其属性查找特定节点并将其子节点用作数据源?

例如如果用户希望查看 transaction_type ,则列表必须仅绑定到第一个节点

<Root>
  <Child Name="transaction_type">
    <Data val="1" Name="authorization"/>
    <Data val="2" Name="confirm"/>
    <Data val="3" Name="purchase"/>
  </Child>
  <Child Name= "transaction_status">
    <Data val="1" Name ="initiated"/>
    <Data val="2" Name ="external processing"/>
  </Child>
  <Child Name ="country_by_bin">
    <Data val="AF" Name="Afghanistan"/>
    <Data val="AX" Name="Aland Islands"/>
    <Data val="AL" Name="Albania"/>
    <Data val="DZ" Name="Algeria"/>
    <Data val="AS" Name="American Samoa"/>
  </Child>

2 个答案:

答案 0 :(得分:1)

您必须遍历Child个节点并获得特定名称的子节点。

然后,您将获得显示成员和值成员列表,如

public class Program
{
    static void Main(string[] args)
    {
        XDocument doc = XDocument.Load(@"C:\Users\xxx\source\repos\ConsoleApp2\Files\XMLFile2.xml");

        var childs = doc.Descendants("Child")
                          .Single(c => c.Attribute("Name").Value == "transaction_type")
                          .Elements().ToList();

        var displayMembers = childs.Attributes("Name").Select(x => x.Value).ToList();
        var valueMembers = childs.Attributes("val").Select(x => x.Value).ToList();
    }
}

输出:

enter image description here

enter image description here

答案 1 :(得分:1)

在这里您可以找到执行xml到DataSet甚至实体转换的代码。尝试使用此转换,然后执行LINQ查询。

        public static string SerializeObject<T>(T dataObject)
        {
            if (dataObject == null)
                throw new InvalidOperationException("Object is NULL");

            using (StringWriter stringWriter = new StringWriter())
            {
                var serializer = new XmlSerializer(typeof(T));
                serializer.Serialize(stringWriter, dataObject);
                return stringWriter.ToString();
            }
        }

        public static T DeserializeObject<T>(string xml)
             where T : class
        {
            if (string.IsNullOrEmpty(xml))
                throw new InvalidOperationException("Empty XML ERROR");

            using (var stringReader = new StringReader(xml))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(stringReader);
            }
        }

实体示例:

    [XmlRoot(ElementName = "CLIENTE")]
    public class Client
    {
        [XmlElement(ElementName = "ROW")]
        public List<ClientInfo> Row { get; set; }
    }

    [Serializable]
    [XmlRoot(ElementName = "ROW")]
    public class ClientInfo
    {
        [XmlElement(ElementName = "TABELA")]
        public string NomeTabela { get; set; }

        [XmlElement(ElementName = "ID_CLIENTE", Type = typeof(int))]
        public int ClienteID { get; set; }

        [XmlElement(ElementName = "ID_CLIENTE_RECADASTRO")]
        public string ClientIDRecadastro { get; set; }

        [XmlElement(ElementName = "NOME_CLIENTE")]
        public string NomeCliente { get; set; }

        [XmlElement(ElementName = "TIPO_CLIENTE")]
        public string TipoCliente { get; set; }

        [XmlIgnore]
        public DateTime DataRecadastro { get; set; }