Zdravím, potřeboval bych poradit se zpracováním XML souboru.. Mělo by to být jednoduché :) Potřebuju jenom aktualizovat soubor.
XML soubor vypadá takto:
<?xml version="1.0" encoding="utf-8" ?>
<weby>
<web id="1">
<url>http://www.seznam.cz</url>
<regexp>helloworld</regexp>
<downloadregexp>helloworld.php?dowload=true</downloadregexp>
<day>22.5.2003</day>
<casovac>500</casovac>
<lastvisited>23.5.2006</lastvisited>
<action>alert</action>
</web>
</weby>
Do tohoto souboru potřebuju přidávat nové weby. Napsal sem si na to jednoduchou dvojici metod:
// přidání nového webu do dokumentu
public void add(Weby cweb)
{
XmlElement web, url, regexp, downloadregexp, day, casovac, lastvisited, action;
web = xmldoc.CreateElement("web");
url = xmldoc.CreateElement("url");
regexp = xmldoc.CreateElement("regexp");
downloadregexp = xmldoc.CreateElement("downloadregexp");
day = xmldoc.CreateElement("day");
casovac = xmldoc.CreateElement("casovac");
lastvisited = xmldoc.CreateElement("lastvisited");
action = xmldoc.CreateElement("action");
url.InnerText = cweb.Url;
regexp.InnerText = cweb.Regexp;
downloadregexp.InnerText = cweb.DownloadRegexp;
day.InnerText = cweb.Day.ToString();
casovac.InnerText = "Not implemented";
lastvisited.InnerText = cweb.Lastvisited.ToString();
action.InnerText = "Not implemented";
web.SetAttribute("id", Weby.count.ToString());
web.AppendChild(url);
web.AppendChild(regexp);
web.AppendChild(downloadregexp);
web.AppendChild(day);
web.AppendChild(casovac);
web.AppendChild(lastvisited);
web.AppendChild(action);
this.xmldoc.DocumentElement.InsertAfter(web, this.xmldoc.DocumentElement.LastChild);
}
// uložení souboru
public void saveXML()
{
this.xmldoc.Save(this.file);
}
ještě metoda na otevření souboru:
public void openFile(string filepath)
{
this.file = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite);
this.xmldoc = new XmlDocument();
xmldoc.Load(this.file);
}
A výsledný kód je toto:
<?xml version="1.0" encoding="utf-8" ?>
<weby>
<web id="1">
<url>http://www.seznam.cz</url>
<regexp>helloworld</regexp>
<downloadregexp>helloworld.php?dowload=true</downloadregexp>
<day>22.5.2003</day>
<casovac>500</casovac>
<lastvisited>23.5.2006</lastvisited>
<action>alert</action>
</web>
</weby>
<?xml version="1.0" encoding="utf-8"?>
<weby>
<web id="1">
<url>http://www.seznam.cz</url>
<regexp>helloworld</regexp>
<downloadregexp>helloworld.php?dowload=true</downloadregexp>
<day>22.5.2003</day>
<casovac>500</casovac>
<lastvisited>23.5.2006</lastvisited>
<action>alert</action>
</web>
<web id="1">
<url>http://www.gůgl.com</url>
<regexp>regular</regexp>
<downloadregexp>
</downloadregexp>
<day>27.9.2008 10:05:19</day>
<casovac>Not implemented</casovac>
<lastvisited>1.1.0001 0:00:00</lastvisited>
<action>Not implemented</action>
</web>
</weby>
- dokument je tam 2x... je to způsobeno pravděpodobně tím, že ukazatel je nataven na konec souboru a metoda xmldoc.save() do toho souboru přidá celý dokument znovu (tentokrát aktualizovaný). Tento problém by se jistě dal velice jednoduše vyřešit smazáním dosavadního obsahu souboru a vložením nového, jenže to nechci. Potřeboval bych nějak ten soubor pouze aktualizovat. (za poslední web by se doplnil nový)
Mělo by na to stačit nastavit ukazatel před tag </weby>
(napadlo mě použít BinaryWriter a metodu Seek, ale binaryWriter dělal neplechu s kódováním a vkládal tam na začátek nesmyslné znaky (BOM?), navíc BinaryWriter taky přepíše konec souboru když nastavím Seek ještě před konec) a vložit pouze element <web> s jeho potomkama (jednoduše získám jejich XML výpis pomocí outerXML metody)
P.S: Jedná se o NET framework 3.5 a dělám ve Visual Studio 2008 professional