0

Вопрос по LinqToXml в c#.

Есть: класс Something

public class Something
    {
        private String id;

        public String Id
        {
            get { return id; }
            set { id = value; }
        }

        private String name;

        public String Name
        {
            get { return name; }
            set { name = value; }
        }

        public Something(String id, String name)
        {
            this.id = id;
            this.name = name;
        }
        public Something()
        {
            this.id = null;
            this.name = null;
        }
    }

Есть xml-файл, который выглядит следующим образом:

<Root>
 <Node>
  <Something id="1" name="name1"/>
  <Something id="2" name="name2"/>
 </Node>
</Root>

Собственно вопрос: как вытащить из этого xml файла List<Something> с полями id и name? На SO нашел похожий вопрос, но для файла типа:

<Root>
 <Node>
   <Something>name1</Something>
   <Something>name2</Something>
 </Node>
</Root>

как сделать у себя что-то никак не впилю.

Обновлено


Что-то не получается. Делал так:

 public MainPage()
        {
            InitializeComponent();
    // что-то происходит
            WebClient wc = new WebClient();
            wc.DownloadStringCompleted += HttpsCompleted;
            wc.DownloadStringAsync(new Uri(testUri.ToString()));
    }

И далее:

private void HttpsCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {

                XDocument xdoc = XDocument.Parse(e.Result, LoadOptions.None);
// XML-документ сюда приходит, видно через пошаговую отладку

                try
                {
                    List<Something> something = (from node in xdoc.Descendants("Something") select new Something(node.Attribute("id").Value, node.Attribute("name").Value)).ToList();

List не заполняется.

Навалял еще по быстрому тестовый вариант с получением XML-файла с локального источника:

public MainPage()
        {
            InitializeComponent();
            XDocument xdoc = XDocument.Load("XMLFile1.xml");

            try
            {
                List<Something> musicFolder = (from node in xdoc.Descendants("Something") select new Something(node.Attribute("id").Value, node.Attribute("name").Value)).ToList();

            }
            catch (Exception ex) { }

Но аналогично, в лист ничего не добавляется.

4
  • 1
    Так а чего вы проглатываете исключения? Может хоть MessageBox туда, вдруг вылезет чё... Или просто опечатка где-то в XML-е
    – mantigatos
    23 мая 2012 в 12:06
  • Я ж через пошаговую отладку это все прохожу, если возникнет исключение, я его замечу. Исключений не возникает, в том то и суть.
    – Olter
    23 мая 2012 в 15:34
  • Аж самому интересно :-) Программа (programm_xml): public static void Main(string[] args) { XDocument xdoc = XDocument.Load("XMLFile1.xml"); List<Something> musicFolder = (from node in xdoc.Descendants("Something") select new Something(node.Attribute("id").Value, node.Attribute("name").Value)).ToList(); foreach(Something e in musicFolder) { Console.WriteLine(e); } } Вывод: ![вывод][1] [1]: i.imgur.com/dN915.png
    – mantigatos
    23 мая 2012 в 15:56
  • Все, разобрался. Суть была в том, что xml файл имеет вид: <Root xmlns="ТутНечто"> Работать будет такое выражение: XNamespace p = "СюдаXMLNS"; List<Something> musicFolder = (from node in xdoc.Descendants(p + "Something") select new Something(node.Attribute("id").Value, node.Attribute("name").Value)).ToList(); [Суть проблемы, решение на MSDN][1] [1]: social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/…
    – Olter
    24 мая 2012 в 5:36

1 ответ 1

3

Вот так:

List<Something> entities = (from node in document.Descendants("Something") select new Something(node.Attribute("id").Value, node.Attribute("name").Value)).ToList();

Чтобы добраться до атрибутов используйте XElement.Attribute

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.