C# XML найти значение атрибута в СПИСКЕ - РЕШЕНО - PullRequest
0 голосов
/ 10 июля 2020

РЕДАКТИРОВАТЬ: ВОПРОС РЕШЕН, СПАСИБО ВСЕМ ЗА ОТВЕТЫ! Уважаемые программисты StackOverflow. Мне нужна быстрая помощь, у меня есть xml файл с такой структурой:

<kazaliste>
    <glumci>
        <glumac id="200" ime="Drasko" prezime="Zidar"></glumac>
    </glumci>
    <predstave>
        <predstava id="2120" naziv="Dubravko Habek BIJELA KUGA">
            <glumci>
                <glumac>110</glumac>
                <glumac>200</glumac>
                <glumac>170</glumac>
            </glumci>
        </predstava>
    </predstave>
    <prikazivanja>
        <prikazivanje predstava="2110" pocetak_dan="16" pocetak_mjesec="2" pocetak_godina="2020" pocetak_vrijeme="19:00"></prikazivanje>               
    </prikazivanja>
</kazaliste>

Моя структура и СПИСОК:

    public struct Predstave
    {
        public int ID;
        public string Naziv;
        public List<int> gID;

        public Predstave(int id, string naziv, List<int> gid)
        {
            ID = id;
            Naziv = naziv;
            //asign gid to gID
            gID = gid;
        }
    }

СПИСОК:

        public static void PrikaziSvePredstaveSaGlumcima()
    {
        List<Predstave> predstava = DohvatiPredstave();

        List<Glumci> glumac = DohvatiGlumce();

        for (int i = 0; i < glumac.Count; i++)
        {
            Console.WriteLine((i + 1) + ". " + glumac[i].Ime + " " + glumac[i].Prezime);
            for (int k =0; k < predstava.Count; k++)
            {
                if (glumac[i].ID.Equals(predstava[k].gID))
                Console.WriteLine("Predstave: " + predstava[k].Naziv);
            }
        }
    }

Это работает, записывает все gluma c в первую часть xml, но никакие представки с их id не отображаются вообще.

Окончательный результат выглядит так:

  1. Драско Зидар
  2. Еще одна глюма c
  3. ...

А мне нужно, чтобы он выглядел так:

  1. Drasko Zidar Predstave: predstava1 (с его ID в качестве элемента), predstava2 ... так далее, пока его нет, после этого функция переключается на другую gluma c и повторяет процесс
  2. glumac2 Predstave: predstava4 , представ5 ...

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Как и ответ @Miller, Linq to Xml прост, но если вы хотите использовать XmlDocument, вы можете изменить код, например:

1 - sXml для теста:

string sXml = @"
<kazaliste>
    <predstave>
     <predstava id='2110' naziv='Vaclav Havel AUDIJENCIJA'>
      <glumci>
       <glumac>140</glumac>
       <glumac>200</glumac>
      </glumci>
     </predstava>
      <predstava id='2111' naziv='Vaclav Havel AUDIJENCIJA1'>
      <glumci>
       <glumac>141</glumac>
       <glumac>201</glumac>
      </glumci>
     </predstava>
    </predstave>
</kazaliste>";

2 - Predstave class, немного измените конструктор:

public struct Predstave
{
    public int ID;
    public string Naziv;
    public List<int> gID;

    public Predstave(int id, string naziv, List<int> gid)
    {
        ID = id;
        Naziv = naziv;
        //asign gid to gID
        gID = gid;
    }
}

3 - DohvatiPredstave method, вы могли бы oop на gluma c для каждого predstava node, например:

XmlDocument oXml = new XmlDocument();
oXml.LoadXml(sXml);

XmlNodeList oNodes = oXml.SelectNodes("//kazaliste/predstave/predstava");
foreach (XmlNode oNode in oNodes)
{
    int id = Convert.ToInt32(oNode.Attributes["id"].Value);
    string naziv = oNode.Attributes["naziv"].Value;
    List<int> gid = new List<int>();

    foreach (XmlNode gNode in oNode.SelectNodes("./glumci/glumac"))
    {
        gid.Add(Convert.ToInt32(gNode.InnerText));
    }

    Predstave oPredstava = new Predstave(id, naziv, gid);
    predstava.Add(oPredstava);
}

4 - Linq to Xml XDcoument:

XDocument xDocument = XDocument.Parse(sXml);

List<Predstave> result = xDocument.Descendants("predstava")
    .Select(x => new Predstave
    {
        ID = int.Parse(x.Attribute("id").Value),
        Naziv = x.Attribute("naziv").Value,
        gID = x.Descendants("glumac")
            .Select(y => int.Parse(y.Value))
            .ToList()
    }).ToList();

Надеюсь, вы найдете это полезным.

2 голосов
/ 10 июля 2020

Вы можете использовать структуру, но лучше использовать Xml Linq.

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

namespace ConsoleXml
{
    class Program
    {
        public struct Predstave
        {
            public int ID;
            public string Naziv;
            public List<int> gID;

            public Predstave(int id, string naziv)
            {
                ID = id;
                Naziv = naziv;
                gID = new List<int>();
            }

            public override String ToString()
            {
                return "{id: " + ID + ", Naziv: " + Naziv + ", gID: [" + string.Join(", ", gID) + "]}";
            }
        }

        public static List<Predstave> DohvatiPredstave(string sXml)
        {           
            //Load xml
            XDocument xdoc = XDocument.Parse(sXml);

            //Run query
            var oNodes = from oNode in xdoc.Descendants("predstava")
            select new
            {
                ID = oNode.Attribute("id").Value,
                Naziv = oNode.Attribute("naziv").Value,
                Glumci = oNode.XPathSelectElements("glumci/glumac")
            };

            List<Predstave> predstava = new List<Predstave>();
            foreach (var oNode in oNodes)
            {
                Predstave oPredstava = new Predstave(int.Parse(oNode.ID), oNode.Naziv);
                predstava.Add(oPredstava);
                foreach (var glumac in oNode.Glumci)
                    oPredstava.gID.Add(int.Parse(glumac.Value));
            }

            return predstava;
        }

        static void Main(string[] args)
        {
            string sXml = "<predstave><predstava id='2110' naziv='Vaclav Havel AUDIJENCIJA'><glumci><glumac>140</glumac><glumac>200</glumac></glumci></predstava></predstave>";
            List<Predstave> predstava = DohvatiPredstave(sXml);
            //Loop through results
            foreach (var oPredstava in predstava)
                Console.WriteLine(oPredstava);
            Console.WriteLine("\n");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...