Прочтите XML с помощью Linq C#, используя условие where - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь сделать небольшой сервис для своего бизнеса, но это не работает.

<item>
<key>12323</key>
<summary></summary>
<reporter username="12313asdf">1232 asdf iii</reporter>
   <cusomfields>
        <customfield id="customfield_37723" key="xyz">
          <customfieldname>First Name</customfieldname>
          <customfieldvalues>
            <customfieldvalue>Klaus</customfieldvalue>
          </customfieldvalues>
        </customfield>
//...many customfields
   </customfields>
</item>

Я создал метод c# с этим кодом -> но он не работает: (

XDocument doc = XDocument.Load(fileName);

var obj = (from c in doc.Descendants("item")
          select new ServiceRequest_NewUser()
          {
           TicketID = c.Element("key").Value,
           Summary = c.Element("summary").Value,
           ReporterNT = c.Element("reporter").Attribute("username").Value,
           ReporterFull = c.Element("reporter").Value,
           FirstName = (from f in c.Descendants("customfields")
                        where f.Element("customfield")?.Attribute("id")?.Value == "customfield_37723"
                        select f.Descendants("customfieldvalues").FirstOrDefault()?.Value).FirstOrDefault()
           }).ToList();

foreach (var i in obj)
{
 var test = i.FirstName;
 Console.WriteLine($"{i.TicketID} {i.Summary} {i.ReporterNT} {i.ReporterFull} {i.FirstName}");
}

В чем моя вина? Я сделал альтернативную версию кода в теге комментария. Мне нужно вывести значение «Klaus».

Заранее благодарю вас за помощь.

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Попробуйте следующее:

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

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

            List<Item> items = doc.Descendants("item").Select(x => new Item()
            {
                key = (string)x.Element("key"),
                summary = (string)x.Element("summary"),
                usernameText = (string)x.Element("reporter"),
                username = (string)x.Element("reporter").Attribute("username"),
                fields = x.Descendants("customfield").Select(y => new Field()
                {
                    id = (string)y.Attribute("id"),
                    key = (string)y.Attribute("key"),
                    name = (string)y.Element("customfieldname"),
                    values = y.Descendants("customfieldvalue").Select(z => (string)z).ToList()
                }).ToList()
            }).ToList();

            List<Item> customfield_37723 = items.Where(x => x.fields.Any(y => y.id == "customfield_37723")).ToList();

            foreach (Item item in customfield_37723)
            {
                Console.WriteLine("Item : key = '{0}', summary = '{1}', username Text = '{2}', username = '{3}'",
                    item.key, item.summary, item.usernameText, item.username);

                foreach (Field field in item.fields)
                {
                    Console.WriteLine("     Field : id = '{0}', key = '{1}', name = '{2}', values = '{3}'",
                        field.id, field.key, field.name, string.Join(",", field.values));
                }
            }

            Console.ReadLine();
        }
    }
    public class Item
    {
        public string key { get; set; }
        public string summary { get; set; }
        public string usernameText { get; set; }
        public string username { get; set; }
        public List<Field> fields { get; set; }

    }
    public class Field
    {
        public string id { get; set; }
        public string key { get; set; }
        public string name { get; set; }
        public List<string> values { get; set; }
    }
}
0 голосов
/ 09 мая 2020

Если вы ожидали увидеть Клауса в имени, напишите следующее:

            var obj = (from c in doc.Elements("item")
                select new
                {
                    TicketID = c.Element("key")?.Value,
                    Summary = c.Element("summary")?.Value,
                    ReporterNT = c.Element("reporter")?.Attribute("username")?.Value,
                    ReporterFull = c.Element("reporter").Value,
                    FirstName = (from f in c.Descendants("customfields")
                        where f.Element("customfield")?.Attribute("id")?.Value == "customfield_37723"
                        select f.Descendants("customfieldvalues").FirstOrDefault()?.Value).FirstOrDefault()
                }).ToList();
...