Jak przeszukać plik xml?

Wątek przeniesiony 2014-01-11 01:43 z C# i .NET przez somekind.

0

Mam taki problem,
zrobiłam program w Windows Forms pobierający od użytkownika dane i zapisujący je do pliku xml.
Jednak chciałam również zrobić wyszukiwanie na podstawie tekstu w textBoxie albo w comboBoxie.
Jednak nie wiem jak przeszukać plik oraz żeby zwracał mi wszystkie wyniki dotyczące tego składnika.
Mam już wyświetlanie tabeli - ale nie wiem jak przeszukać ten plik :(
Pomocy !

0

a na przykład pętlą: dla każdego 'dziecka' w xml jeśli wartość równa się 'coś' to dodaj do listy/wyświetl

1

albo LINQ to XML

0

Tylko że w wersji pętli musiałabym mieć z 50 warunków. a LINQ nie potrafię użyć :(

1

50? a co ty chcesz znaleźć w tym pliku :)

podaj cześć kodu programu najlepiej.

XDocument xdoc = XDocument.Load(@"Path");
    foreach (var us in xdoc.Descendants("Base"))
        if (!string.IsNullOrEmpty(us.Element("Name").Value) && us.Element("Name").Value.Equals(this.textBox1.Text))
        {
        }

http://stackoverflow.com/questions/11356895/linq-to-xml-find-an-element

0

Ogólnie to wygląda tak:
http://speedy.sh/VBUBw/1.png
http://speedy.sh/CfJfj/2.png
Mam wyszukiwanie i do odpowiednich pól przypisane wartości.
Czyli choćby w samym rodzaju jest z 20 pozycji.
Z kodu wyszukującego nie mam nic poza wyświetlaniem tabelki ze wszystkim,
czyli jej ustawienia wyświetlania

  • co wyswietla:
ListViewItem[] items = new ListViewItem[Program.mojeUbrania.Count];
                for (int i = 0; i < Program.mojeUbrania.Count; i++)
                {
                    items[i] = new ListViewItem(Program.mojeUbrania[i].styl);
                    items[i].SubItems.Add(Program.mojeUbrania[i].rozmiar);
                    items[i].SubItems.Add(Program.mojeUbrania[i].kolor);
                    items[i].SubItems.Add(Program.mojeUbrania[i].rodzaj);
                    items[i].SubItems.Add(Program.mojeUbrania[i].kondycja);
                    items[i].SubItems.Add(Program.mojeUbrania[i].ocena.ToString());
                    items[i].SubItems.Add(Program.mojeUbrania[i].marka);
                    items[i].SubItems.Add(Program.mojeUbrania[i].opis);
                    items[i].SubItems.Add(Program.mojeUbrania[i].zdjecie);
                } 
0

Próbowałam tamtego kodu już wcześniej, niestety mam błąd z XDocument :(

0

Mam kod napisany tak:

 XDocument xdoc = XDocument.Load(@"C:\Users\Klaudia2\Desktop\Ubra.xml");
            foreach (var us in xdoc.Descendants("Ubrania"))
                if (!string.IsNullOrEmpty(us.Element(comboBox1.Text).Value) && us.Element(comboBox1.Text).Value.Equals(this.textBox1.Text))
                { 

A bład:
Error 1 'string' does not contain a definition for 'Text' and no extension method 'Text' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?) C:\Users\Klaudia2\Documents\Visual Studio 2010\Projects\Ubrania\Ubrania\Form3.cs 143 98 Ubrania

1
us.Element(comboBox1.Text) // źle (no chyba że tu jest nazwa elementu)
<Base>
    <Item>
        <Name>ss</Name>
        <Value>aa</Value>
    </Item>
    <Item>
        <Name>rr</Name>
        <Value>ww</Value>
    </Item>
</Base>
us.Element("Name").Value
if (us.Element("Name").Value.Equals(this.textBox1.Text) //jeśli Name = this.textBox1.Text, czyli np to 'ss';
0

a co z robić kiedy wyświetla mi nie te pozycje co ma ? Albo je podwaja?
mam 2 comboBoxy ( w tym 1 pojawiający sie jeśli jest możliwość wyboru elementu do wyszukania z listy już podanych) oraz 1 textBoxa (dla tych dla których nie ma już stworzonych elementów).

Kod mam taki:

 XDocument xdoc = XDocument.Load(@"C:\Users\Klaudia2\Desktop\Ubra.xml");
                    foreach (var us in xdoc.Descendants("Ubrania"))
                        if ((!string.IsNullOrEmpty(us.Element(this.comboBox1.Text).Value) || !string.IsNullOrEmpty(us.Element(this.textBox1.Text).Value)) && (us.Element(this.comboBox1.Text).Value.Equals(this.textBox1.Text) || us.Element(this.comboBox1.Text).Value.Equals(this.comboBox2.Text)))
                        {
                        ListViewItem[] items = new ListViewItem[Program.mojeUbrania.Count];  // Tu wczytuje mi z zapisanej wcześniej wartości w programie - jak to zmienić????
                        for (int i = 0; i < Program.mojeUbrania.Count; i++)
                        {
                            items[i] = new ListViewItem(Program.mojeUbrania[i].styl);
                            items[i].SubItems.Add(Program.mojeUbrania[i].rozmiar);
                            items[i].SubItems.Add(Program.mojeUbrania[i].kolor);
                            items[i].SubItems.Add(Program.mojeUbrania[i].rodzaj);
                            items[i].SubItems.Add(Program.mojeUbrania[i].kondycja);
                            items[i].SubItems.Add(Program.mojeUbrania[i].ocena.ToString());
                            items[i].SubItems.Add(Program.mojeUbrania[i].marka);
                            items[i].SubItems.Add(Program.mojeUbrania[i].opis);
                            items[i].SubItems.Add(Program.mojeUbrania[i].zdjecie);
                        }


                        listView.Items.AddRange(items);     // Dodajemy pozycje items[] do listView.
                        this.Controls.Add(listView);
                    }
                }
0

może nie czyścisz listView :)

this.listView.Items.Clear();
0

Jak przeczyszczę to tylko pokazuje mi się pusta tabelka :(
I mam wrażenie, że ten mój program szuka rozwiązania nie w pliku tylko w kodzie w którym są 2 przykładowe pozycje

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Ubrania
{
    public class Ubrania
    {
        // public zmień później na private, dodając właściwości dla poniższych składowych
        public string styl;     
        public string rozmiar;
        public string kolor;
        public string rodzaj;
        public string kondycja;
        public int ocena;
        public string marka;
        public string opis;
        public string zdjecie;

        public Ubrania()    // Niezbedny bezparametrowy konstruktor (dla serializacji)
        { }
        public Ubrania(string st, string rozm, string kol, string rodz, string kond, int oce, string mark, string op, string zdj)
        {
            styl = st;
            rozmiar = rozm;
            kolor = kol;
            rodzaj = rodz;
            kondycja = kond;
            ocena = oce;
            marka = mark;
            opis = op;
            zdjecie = zdj;
        }
    }
   

   
    static class Program
    {

        
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static private Ubrania[] tab = { new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard.jpg"),
                                       new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard2.jpg") };


        static public List<Ubrania> mojeUbrania = new List<Ubrania>(tab);   // Tworzymy publiczną kolekcję - listę filmów. Użytkownik będzie mógł do niej dodawać ubrania
        
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
         
0
kotecek napisał(a):

Jak przeczyszczę to tylko pokazuje mi się pusta tabelka :(


A czyścisz przed czy po wyświetleniu?

Program zapewne szuka pliku tam, gdzie się uruchomił jeśli nie podałaś innej ścieżki, umiesz się zapiąć debuggerem w miejscu czytania XML i to sprawdzić?
0

Właśnie problem tkwi w tym że tworzę listView dla czegoś co już istnieje w kodzie programu - do utworzonej innej tablicy

 ListViewItem[] items = new ListViewItem[Program.mojeUbrania.Count];

A w sumie nie wiem czy tak moze być.
Bo plik mi przeszukuje i jak znajdzie to czego szuka to wyświetla mi tabelkę - ale nie wyświetla elementów które się znajdują w tym pliku :(

0

static public List<Ubrania> mojeUbrania = new List<Ubrania>(tab); // Tworzymy publiczną kolekcję - listę filć mów.

Po co wypełniać tablicę i tworzyć z niej listę, skoro można od razu wypełnić listę?

0

hm? Mogę prosić o podpowiedź? :)

0

ale ja nie wiem jak to zrobić :(

0

Nie, nie wiem

0

Zobacz na przykłady - http://www.dotnetperls.com/initialize-list - na samym dole jest, co potrzebujesz: "Program that initializes object Lists: C#".

0
 static private List<Ubrania> tab = new List<Ubrania> { new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard.jpg"),
                                       new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard2.jpg") };
0

Rozumiem że tak nie można?

XDocument xdoc = XDocument.Load(@"C:\Users\Klaudia2\Desktop\Ubra.xml");
                    foreach (var us in xdoc.Descendants("Ubrania"))
                        if ((!string.IsNullOrEmpty(us.Element(this.comboBox1.Text).Value) || !string.IsNullOrEmpty(us.Element(this.textBox1.Text).Value)) && (us.Element(this.comboBox1.Text).Value.Equals(this.textBox1.Text) || us.Element(this.comboBox1.Text).Value.Equals(this.comboBox2.Text)))
                        {
                            listView1.Add(us.SelectSingleNode("styl").Value);
                        } 
0

Już tak próbowałam ale otrzymuję 2 komunikaty o błędach:

" Error 2 'System.Xml.Linq.XElement' does not contain a definition for 'SelectSingleNode' and no extension method 'SelectSingleNode' accepting a first argument of type 'System.Xml.Linq.XElement' could be found (are you missing a using directive or an assembly reference?) C:\Users\Klaudia2\Documents\Visual Studio 2010\Projects\Ubrania\Ubrania\Form3.cs 168 46 Ubrania
"

"Error 1 'System.Windows.Forms.ListView' does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'System.Windows.Forms.ListView' could be found (are you missing a using directive or an assembly reference?) C:\Users\Klaudia2\Documents\Visual Studio 2010\Projects\Ubrania\Ubrania\Form3.cs 168 39 Ubrania
"