XmlReader - načtení hodnoty elementu podle atributu   otázka

C#, XML, .NET

Potřebuji načíst hodnotu elementu na základě zadaného atributu pomocí XmlReaderu. Kód vypadá takto:

public void SelectXMLviaReader(object sender, EventArgs e)
        {
            int id = int.Parse(((System.Web.UI.WebControls.Button)(sender)).CommandArgument);
            string path = HttpContext.Current.Server.MapPath("~/App_Data/Config.xml");
            using (XmlReader reader = XmlReader.Create(path))
            {
                while (reader.Read())
                {
                    if (reader.HasAttributes && reader.Name == "device")
                    {
                        TextBox7.Text = id.ToString();
                    }
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (reader.Name == "device_name")
                        {
                            reader.Read();
                            TextBox1.Text = reader.ReadContentAsString();
                            return;
                        }
                        
                    }
                }
            }
        }

Takhle je to samozřejmě blbě, protože se mi načítá vždy hodnota prvního elementu, ale nějak se nemůžu dopracovat ke správnému řešení. Děkuji za pomoc.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A co zkusit vyhledat pomocí XmlNode takový node,který má právě daný atribut a pak jen už prolézt přidružené elementy a je to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A jak by to vypadalo v tomto mém případě ? Maximálně se mi stane to, že ten přidružený element mi to nenajde žádný ... asi to píšu špatně.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Já bych to zkusil třeba takto:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(''cesta k souboru'');

XmlNodeList nodes = xmlDoc.SelectNodes("Root/...");
foreach (XmlNode node in nodes)
{
var elemValue = elem.Attributes["''atribute value''"].Value;
if (value == "'hodnota'") 

Po if stačí jen dospat logiku co se má stát pokud takový element existuje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možná by bylo nejvhodnější a nejčistší použít XPath,ale v tom moc často nedělám a tak bych zdlouhavě vymýšlel jak na to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

XPath je ta nejčistší a nejefektivnější metoda. Vůbec to není tak složité jak se zdá, narozdíl od např. Regular Expressions.

http://www.w3schools.com/XPath/xpath_syn...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Přes XmlDocument s tím nemám problém, potřebuji to řešit přes XmlReader.

Nikdo se zkušenostmi s XmlReaderem ?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A proč potřebujete zrovna XmlReader,nějaký adekvátní důvod.

Výše popsaný způsob samozřejmě funguje.Další a mnohem elegantnější formou je použití XPath,jak již psal p.Linhart.Kód pak vyjde cca na 5 řádků.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když to udělám hodně amatérsky, ale funkčně (je tam jen 1 podelement), tak to vypadá takto:

public void SelectXMLviaReader(object sender, EventArgs e)
        {
            int id = int.Parse(((System.Web.UI.WebControls.Button)(sender)).CommandArgument);
            string path = HttpContext.Current.Server.MapPath("~/App_Data/Config.xml");
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
            using (XmlReader reader = XmlReader.Create(path,settings))
            {
                while (reader.Read())
                {
                    if (reader.Name == "device")
                    {
                        if (reader["id"] == id.ToString())
                        {
                            TextBox7.Text = reader["id"];
                            reader.Read();
                            reader.Read();
                            TextBox1.Text = reader.Value;
                        }
                    }
                }
                reader.Close();
            }
        }

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A jaký máte důvod k tomu,abyste to dělal "amatérsky"?A proč vlastně "musíte" použít XmlReader.Zrovna v tomtu scénáři mi to nepřijde jako vhodné řešení - třeba pomocí již zmíněného XmlDocument ve spojení s XPath je celý problém na pár řádků a mnohem čistší.

Tedy,pokud nemáte pádný důvod k tomu to udělat takto,tak bych se přikláněl a doporučoval tento bastl vyhodit a napsat to znovu a lépe.Způsobů jak toho docílit je dokonce několik - počínaje XmlDocument,konče XPathIteratory,atd.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Myslím, že je to úplně jedno, jasně jsem na začátku napsal, že mě zajímá řešení přes XmlReader. Proč řešit něco jiného ? Můj kód je dost amatérský, ale funguje naprosto perfektně a splňuje využití XmlReaderu. Na druhé straně tu nebyl vůbec nikdo schopen napsat jakékoliv řešení ...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

S Vaším přístupem asi nemyslíte programování vážně! Přeci nemůžete jako argument použít to že prostě chcete - tedy samozřejmě můžete,ale pak výsledné produkty budou taky tak vypadat.

V programování je třeba vždy využívat nejvhodnější zdroje a nástroje.V tomto případě zrovna využití XmlReaderu za vhodné osobně nepovažuji,jelikož se spíše hodí na situace kdy čtete XML z nějakého streamu.Ve vaší situaci však čtete "statický" soubor,tudíž je vhodnější obsah souboru načíst a nad ním dále pracovat (XmlDocument,XPath,..).Poté nebudete muset "ručně" posouvat čtení souboru - viz. váš kód a kus s reader.Read(),reader.Read().Pokud byste se nyní rozhodl že změníte strukturu souboru nebo jej rozšíříte,tak byste poznal nevhodnost řešení - musel byste předělat v podstatě celý kód.V navrhovaném případě by se upravil pouze XPath dotaz,který potažmo můžete mít uložený např.ve web.configu a tak jej bude možné dynamicky měnit -> není nutné.

Konečné rozhodnutí je a vždy bude samozřejmě na vás,nicméně programování je o celoživotním vzdělávání a učení se,tudíž Vám vřele doporučuji naslouchat a učit se.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

O jakém přístupu tady píšete ? Přístup byl přece úplně jasný, to se mám znovu opakovat ? Vždyť já neřeším programování obecně a vůbec se nebavím o vhodnosti nebo nevhodnosti využití této třídy. Zajímalo mě jen konkrétní použití konkrétní třídy (ať už je její vhodnost nebo nevhodnost jakákoliv). Pořád nechápu, co je na tom nepochopitelného ... A když mi tady kritizujete kód, tak konečně představte vlastní řešení (s využitím třídy XmlReader), pokud jste toho schopen ...

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Ještě jednou si přečtě své zadání a pak laskavě reagujte! Pokud jste tu proto,abyste "prudil" ty co se Vám snaží poradit,tak jste tu zbytečně a zbytečný..to se na mě nezlobte.

BTW : Jak už jsem psal několikrát,nikdy bych řešení přes XmlReader nedělal,takže těžko říct.Předpokládám,že by to bylo podobné tomu Vašemu.Jen s tím,že bych zápis trochu zkrátil.Nicméně to nic nemění na tom,že takto je to nevhodně použito...ale pokud je Vám to jedno,tak není co řešit.Užijte si to!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když už se mě snažíte na něčem nachytat, tak to udělejte tak, ať potom sám nejste za vola. V zadání mám úplně jasně napsáno Potřebuji načíst hodnotu elementu na základě zadaného atributu pomocí XmlReaderu.

Já tu vůbec nejsem proto, abych někoho prudil a vůbec nechápu, jak jste na to přišel. Naopak si velice vážím lidí, kteří jsou ochotni poradit a také mi už mnohokrát poradili. V tomto případě jsem jen slušně napsal o jaké řešení se mi jedná. A naopak jste tu vy, který tohle nedokážete z nějakého důvodu pochopit a pořád si melete svou i po několikerém slušném vysvětlování z mé strany ...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Máte pravdu,přehlédl jsem to.V tom případě se omlouvám a klidně použijte to Vaše řešení.Sice to "tahá za uši",ale s tím se nedá nic dělat...ale to se nedá ve vašem případě nic dělat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback