C# - zpracování XML třídou XmlTextReader – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# - zpracování XML třídou XmlTextReader – .NET – Fórum – Programujte.comC# - zpracování XML třídou XmlTextReader – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
marpit0
Stálý člen
8. 3. 2012   #1
-
0
-

Zdravím, generuji XML soubor v následujícím tvaru:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--XML soubor z aplikace VF milivoltmetr-->
<data>
   <statistika prumer="3105" max="3105" jednotka="mV" />
   <vzorek ID_vzorek="0" hodnota="3105" jednotka="mV" />
   <vzorek ID_vzorek="1" hodnota="3105" jednotka="mV" />
   <vzorek ID_vzorek="2" hodnota="3105" jednotka="mV" />
</data>

Potřebuji tento XML soubor zpracovat na pole hodnot. Aktuálně jsem se dostal k tomu, že soubor otevřu, ale nevím jak dál.

private void nacteniDat()
        {
            string cesta;

            openXML.Filter = Properties.Resources.xml;

            IPointListEdit ip = zg1.GraphPane.CurveList[Properties.Resources.seznamHodnot].Points as IPointListEdit;

            if (openXML.ShowDialog() == DialogResult.OK)
            {
                cesta = openXML.FileName;

                XmlTextReader xml = new XmlTextReader(cesta);

                try
                {
                    while (xml.Read())
                    {
                        
                    }
                }

                catch (Exception)
                {
                
                }
            }
        }

Díky všem za rady, zpracování XML není zatím má silná stránka.

Nahlásit jako SPAM
IP: 94.113.181.–
MarPit
liborb
~ Redaktor
+18
Guru
9. 3. 2012   #2
-
0
-

Nejdříve poznámka ke strukturování XML, je to samozřejmě jedno, ale do budoucna by se ti to mohlo hodit, tj. "shlukování" stejných dat. Tím myslím něco takového:

<data>
   <statistika prumer="3105" max="3105" jednotka="mV" />
   <vzorky>
      <vzorek ID_vzorek="0" hodnota="3105" jednotka="mV" />
      <vzorek ID_vzorek="1" hodnota="3105" jednotka="mV" />
      <vzorek ID_vzorek="2" hodnota="3105" jednotka="mV" />
   </vzorky>
</data>

No a co se týká zpracování XML, možná bych radši použil třídu XmlDocument a následně procházel nody přes atributy  Root, FirstChild, NextSibling nebo ještě lépe používal XPath dotazy (SelectNodes). Samozřejmě hodně záleží na tom, co s tím chceš dělat.

Nahlásit jako SPAM
IP: 78.80.52.–
marpit0
Stálý člen
9. 3. 2012   #3
-
0
-

Tak jsem upravil tu strukturu XML. Teď k tomu zpracování, zkoušel jsem něco takového:

private void nacteniDat()
        {
            string cesta;

            openXML.Filter = Properties.Resources.xml;

            IPointListEdit ip = zg1.GraphPane.CurveList[Properties.Resources.seznamHodnot].Points as IPointListEdit;

            if (openXML.ShowDialog() == DialogResult.OK)
            {
                vymazatData();
                
                cesta = openXML.FileName;

                XmlDocument xml = new XmlDocument();
                xml.Load(cesta);

                XmlNodeList nl = xml.GetElementsByTagName(Properties.Resources.xmlVzorek);

                for (int i = 0; i < nl.Count; i++)
                {
                    XmlElement vzorek = (XmlElement)nl.Item(i);
                    
                    ip.Add(ip.Count, Double.Parse(vzorek.InnerText));
                }

                zg1.AxisChange();
                zg1.Invalidate();
                zg1.Refresh();
            }
        }

Funkce by měla být následující, z položek s tágem vzorek vzít hodnotu vzorku a uložit jí do seznamu. Po načtení dochází k překreslení grafu.

Problém je, že program se kompletně při zpracování XML sekne.

Zdroj informací pro mě byl: http://www.kosek.cz/…/dotnet.html

Díky

Nahlásit jako SPAM
IP: 94.113.181.–
MarPit
marpit0
Stálý člen
10. 3. 2012   #4
-
0
-

Nakonec jsem to vyřešil, XML zpracovávám takto:

private void nacteniDat()
        {
            string cesta;
            double hodnota;

            openXML.Filter = Properties.Resources.xml;

            IPointListEdit ip = zg1.GraphPane.CurveList[Properties.Resources.seznamHodnot].Points as IPointListEdit;

            if (openXML.ShowDialog() == DialogResult.OK)
            {
                if (vymazatData())
                {                 
                    cesta = openXML.FileName;

                    XmlTextReader xml = new XmlTextReader(cesta);

                    try
                    {
                        while (xml.Read())
                        {
                            if (xml.NodeType == XmlNodeType.Element)
                            {
                                while (xml.MoveToNextAttribute())
                                {
                                    if (xml.Name == "hodnota")
                                    {
                                        hodnota = double.Parse(xml.Value);

                                        ip.Add(ip.Count, hodnota);
                                    }
                                }
                            }
                        }

                        vykresliGraf();
                        vypisStatistiku();
                    }

                    catch (Exception)
                    {
                        MessageBox.Show(Properties.Resources.chyba05);
                    }

                    finally
                    {
                        xml.Close();
                    }
                }
            }
        }

Možná to není nejlepší způsob, ale funguje to (a třeba to někomu ještě pomůže).

Nahlásit jako SPAM
IP: 94.113.181.–
MarPit
liborb
~ Redaktor
+18
Guru
12. 3. 2012   #5
-
0
-

A takto nějak by to bylo s využitím XPath:

XmlDocument data = new XmlDocument();
data.Load(cesta);
XmlElement koren = data.DocumentElement;String sXPathDotaz = "//data/vzorky/vzorek";
XmlNodeList nodeList = koren.SelectNodes(sXPathDotaz);

foreach (XmlNode uzel in nodeList)
{
	hodnota = double.Parse(uzel.Attributes["hodnota"].InnerText);
        ip.Add(ip.Count, hodnota);
}
Nahlásit jako SPAM
IP: 78.80.52.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

Podobná vlákna

Zpracování XML — založil klinki

Zpracování XML souboru — založil bodmrazu

Pomoc se tridou — založil Jirinas

Problém se třídou Color — založil john

Problém s třídou Object — založil Filip0913

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý