У меня есть XML , как показано ниже, и список в проекте С # , который должен быть привязан к этому XML частично в соответствии с именем ребенка, используя имя данных как DisplayMember и значение данных как ValueMember .

У меня вопрос: как я могу с помощью LINQ найти конкретный узел по его атрибуту и использовать его дочерние элементы в качестве источника данных?

Например. если пользователь хочет увидеть тип транзакции , список должен быть привязан только к первому дочернему узлу

<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>
0
Alex Shangin 17 Сен 2018 в 13:15

2 ответа

Лучший ответ

Вы должны перебрать 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
er-sho 19 Сен 2018 в 01:02

Здесь вы можете найти код, который выполняет преобразование 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; }
1
Victor Laio 17 Сен 2018 в 13:25