Primo Chalice Ответов: 2

Как показать предупреждение, если есть повторяющиеся значения для одного и того же узла XML?


- Привет!

Я написал программу для чтения нескольких xml-файлов и разделения узлов по мере необходимости. Но теперь я хочу показать предупреждение для повторяющихся значений.

Программа работает нормально, но переменная, которую я использовал для проверки значения, всегда равна нулю.

Пожалуйста помочь.

С уважением
Аман

Что я уже пробовал:

private void btnStart_Click(object sender, EventArgs e)
        {
            string path = "";
            int ctr = 0, i = 0;
            while (i < lvwArticles.Items.Count)
            {
                ListViewItem lvi = lvwArticles.Items[i];
                if (lvi.SubItems[2].Text != path)
                {
                    path = lvi.SubItems[2].Text;
                    ctr = 0;
                    skipme = false;
                }
                if (!skipme)
                {
                    ctr++;

                    lvi.EnsureVisible();
                    lvi.Checked = true;
                }

                //XDocument doc = new XDocument(
                //    new XElement("root"));
                XElement credits = new XElement("credits");
                XElement images = new XElement("images");
                //XElement displaynames = new XElement("displayname");

                //new XElement("root",
                //    new XElement("credits"),
                //    new XElement("images"))


                XDocument doc = XDocument.Load(lvi.Tag.ToString(), LoadOptions.None);

                XDocument xdoc = XDocument.Load(lvi.Tag.ToString(), LoadOptions.None);
                var result = xdoc.Descendants("image").ToList();
                int counter = 1;

                foreach (var element in result)
                {
                    string xyz = element.ToString();
                    XElement credit = element.Element("credit");
                    
                    if (credit == null)
                    {
                        AddMsg(lvi.Text + " - Credit Information Missing for tag " + element.Element("primary_picture").Value);
                        continue;
                    }

                    string cr = credit.Value.ToString();

                    if (credits != null)
                    {
                        XElement found = null;
                        found = credits.Elements().Where(el => el.Element("credit").Value == cr).FirstOrDefault();
                        if (found != null)
                        {
                            AddMsg(lvi.Text + " - Duplicate Credit Information for tag " + element.Element("credit").Value);
                            continue;
                        }
                    }
                    
                    XElement image = element;
                    //image.Element("credit").Remove();
                    //XElement displayname = element.Element("displayname");
                    //String bildunterschrift = element.Element("bildunterschrift").Value;

                    //MessageBox.Show(image, credit);

                    counter++; // new number for next file

                    credits.Add(new XElement(credit));
                    images.Add(new XElement(image));
                    //displaynames.Add(new XElement(displayname));

                }
                doc.Descendants("image").Remove();

                doc.Root.Add(credits);
                doc.Root.Add(images);
                //doc.Root.Add(displaynames);
                //doc.Save(lvi.Tag.ToString());

                //XDocument xdocument = new XDocument();
                //xdocument.Add("credits");
                //xdocument.Add("images");
                //xdocument.Save("ssdsdsd.xml", SaveOptions.DisableFormatting);

                i++;

            }
                if (i % 10 == 0)
                {
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(50);
                }
                i++;
        }

Richard MacCutchan

Вы должны дать нам хотя бы ключ к разгадке. Какая переменная и где вы ее устанавливаете?

Primo Chalice

- Привет!

XElement found-это переменная, и она всегда равна нулю.

Maciej Los

Как выглядит ваш xml-файл?
Что вы имеете в виду, говоря "дублировать" значения?

Primo Chalice

< изображение >
&ЛТ; заголовок >Это заголовок.&ЛТ; / подпись &ГТ;
< кредиты >это тестовое предложение. < / кредиты >
< / изображение >


< изображение >
&ЛТ; заголовок >Это еще один заголовок.&ЛТ; / подпись &ГТ;
< кредиты >это тестовое предложение.< / кредиты>
< / изображение >

Таким образом, в приведенном выше случае есть два тега изображений с одинаковым кредитом. Поэтому я хочу отобразить предупреждающее сообщение о том, что кредитное значение "это тестовое предложение" является дубликатом

ZurdoDev

Где ты застрял? Найти дубликаты? Или отображение сообщения?

Primo Chalice

- Привет!

Я застрял в поиске дубликатов. Как уже упоминалось, найденная переменная XElement всегда равна нулю, поэтому сообщение не отображается.

Пожалуйста помочь.

ZurdoDev

Я понятия не имею, о какой строке кода вы говорите. Но все, что вам нужно сделать, это отладить код.

2 Ответов

Рейтинг:
1

Richard MacCutchan

                XElement credits = new XElement("credits");

// ...

                    if (credits != null)
                    {
                        XElement found = null;
                        found = credits.Elements().Where(el => el.Element("credit").Value == cr).FirstOrDefault();

Вы создаете новый элемент без потомков, но затем пытаетесь найти дочерний узел, принадлежащий ему. Так, found всегда будет равен нулю.


Рейтинг:
1

#realJSOP

Я бы использовал MessageBox с соответствующим текстом, указывающим на проблему.