Toto vlákno bylo označeno za vyřešené.
marpit 0
Stálý člen
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.
liborb ~ Redaktor
+18
Guru
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.
marpit 0
Stálý člen
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
marpit 0
Stálý člen
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).
liborb ~ Redaktor
+18
Guru
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);
}
Zjistit počet nových příspěvků
Přidej příspěvek
Uživatelé prohlížející si toto vlákno Uživatelé on-line: 0 registrovaných, 32 hostů