Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要读取XDocument中的重复值_C#_Xml_Linq To Xml - Fatal编程技术网

C# 需要读取XDocument中的重复值

C# 需要读取XDocument中的重复值,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我需要解析XDocument中的以下XML: <RESPONSES> <RESPONSE STATUS="OK"> <ALBUM> <GN_ID>63074689-EDADA0FEDE93683CA03C6D38520A4D88</GN_ID> <ARTIST>Green Day</ARTIST> <TITLE>American Idiot

我需要解析XDocument中的以下XML:

<RESPONSES>
  <RESPONSE STATUS="OK">
     <ALBUM>
        <GN_ID>63074689-EDADA0FEDE93683CA03C6D38520A4D88</GN_ID>
        <ARTIST>Green Day</ARTIST>
        <TITLE>American Idiot</TITLE>
        <PKG_LANG>ENG</PKG_LANG>
        <DATE>2004</DATE>
        <GENRE NUM="105222" ID="35474">Punk</GENRE>
        <TRACK_COUNT>13</TRACK_COUNT>
        <TRACK>
           <TRACK_NUM>1</TRACK_NUM>
           <GN_ID>63074690-456E41C113DC8354DC6B25421F2C7989</GN_ID>
           <TITLE>American Idiot</TITLE>
        </TRACK>
        <TRACK>
           <TRACK_NUM>2</TRACK_NUM>
           <GN_ID>63074691-70EFB1E8EB31B5296D5822E55343EFA9</GN_ID>
           <TITLE>Jesus Of Suburbia / City Of The Damned / I Don&apos;t Care / Dearly Beloved / Tales Of Another Broken Home</TITLE>
        </TRACK>
        <URL TYPE="COVERART" SIZE="THUMBNAIL" WIDTH="75" HEIGHT="75">http://akamai-b.cdn.cddbp.net/cds/2.0/cover/0A1A/BABF/DEBC/CF21_thumbnail_front.jpg</URL>
        <URL TYPE="ARTIST_BIOGRAPHY">http://web.content.cddbp.net/cds/2.0?id=E1DA4CCF2BBE645C&amp;client=10395648&amp;class=biography&amp;type=text/plain&amp;tag=02vq7D8a8HkrfJ4rWglsq09xYTY0H7Fb.YOadB73lz1-z3EWy.dWzCVA</URL>
     </ALBUM>
   </RESPONSE>
</RESPONSES>
我可以根据标签来判断曲目的数量,但除此之外,曲目的数量会因专辑而异。下面是我解析XDocument的现有C代码:

   var albums = new List<Album>();
        try
        {
            albums = (from item in inputDoc.Descendants("ALBUM") //.Elements("GN_ID")

                      select new Album
                          {
                              AlbumId = (string)item.Element("GN_ID"),
                              ArtistName = (string)item.Element("ARTIST"),
                              AlbumName = (string)item.Element("TITLE"),
                              TrackCount = (int)item.Element("TRACK_COUNT"),
                              Year = (string)item.Element("DATE"),
                              Genre = (string)item.Element("GENRE"),
                              CoverArt = item.Elements("URL").First(u => u.Attribute("TYPE").Value == "COVERART").Value.ToString(),
                              Biography = item.Elements("URL").First(u => u.Attribute("TYPE").Value == "ARTIST_BIOGRAPHY").Value.ToString()

                          }).ToList();



        }
下面是我正在阅读的结构:

namespace MusicApp.Model
{
    public class Album
    {
        public string ArtistName { get; set; }
        public string AlbumId { get; set; }
        public string AlbumName { get; set; }
        public int TrackCount { get; set; }
        public string Year { get; set; }
        public string Genre { get; set; }
        public string CoverArt { get; set; }
        public string Biography { get; set; }

        // Navigation properties
        public ICollection<Track> Tracks { get; set; }
    }
    public class Track
    {
        public string TrackId { get; set; }
        public int TrackNumber { get; set; }
        public string TrackName { get; set; }
        public string AlbumId { get; set; }
    }
}
但我不知道如何解析这些轨迹,因为无法提前知道给定响应中会有多少轨迹。有人能帮我解决这个问题吗

哦,当我在做这件事的时候,我如何转换符号和APO;替换为除string.replace以外的撇号

提前谢谢

只需添加

Tracks = item.Elements("TRACK")
            .Select(t=> new Track{
                TrackNumber = (int)t.Element("TRACK_NUM"),
                TrackName = (string)t.Element("TITLE"),
                TrackId = (string)t.Element("GN_ID"),
            }).ToList()
到您的代码

因此,整个代码将是

var albums = (from item in inputDoc.Descendants("ALBUM") 

            select new Album
            {
                AlbumId = (string)item.Element("GN_ID"),
                ArtistName = (string)item.Element("ARTIST"),
                AlbumName = (string)item.Element("TITLE"),
                TrackCount = (int)item.Element("TRACK_COUNT"),
                Year = (string)item.Element("DATE"),
                Genre = (string)item.Element("GENRE"),
                CoverArt = item.Elements("URL").First(u => u.Attribute("TYPE").Value == "COVERART").Value.ToString(),
                Biography = item.Elements("URL").First(u => u.Attribute("TYPE").Value == "ARTIST_BIOGRAPHY").Value.ToString(),
                Tracks = item.Elements("TRACK")
                        .Select(t=> new Track{
                            TrackNumber = (int)t.Element("TRACK_NUM"),
                            TrackName = (string)t.Element("TITLE"),
                            TrackId = (string)t.Element("GN_ID"),
                        }).ToList()
            }).ToList();

谢谢LB-这很好用!剩下的一个问题是:如何在曲目中填充AlbumId,这是返回Album->AlbumId的外键?哦,当我在做这件事的时候,我如何转换符号和APO;替换为字符串以外的撇号。@user3171260 a如果您已经执行了stringitem.ElementGN_ID,只需在轨迹块中重复它。b代表&apos;你不必做任何特别的事。xml解析器可以处理它。