简体   繁体   English

使用 where 条件读取 XML 和 Linq C#

[英]Read a XML with Linq C# using where condition

I try to make a little Service for my business but it doesn't works.我尝试为我的业务提供一点服务,但它不起作用。

<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>

I created a c# method with this code -> but it doesn't work:(我用这段代码创建了一个 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}");
}

Where is my fault?我的错在哪里? I did a alternative version of code in the comment tag.我在评论标签中做了一个替代版本的代码。 I need to output the value "Klaus".我需要 output 值“克劳斯”。

I thank you in advance for the help.我提前感谢您的帮助。

If you expected to see Klaus in the FirstName, you should write this:如果您希望在 FirstName 中看到 Klaus,您应该这样写:

            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();

Try following:尝试以下操作:

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; }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM