Zpracování XML – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zpracování XML – .NET – Fórum – Programujte.comZpracování XML – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
klinki0
Návštěvník
27. 9. 2008   #1
-
0
-

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

Nahlásit jako SPAM
IP: 85.13.98.–
Reklama
Reklama
mnn
~ Anonymní uživatel
118 příspěvků
27. 9. 2008   #2
-
0
-

namiesto tohto riadku

this.xmldoc.DocumentElement.InsertAfter(web, this.xmldoc.DocumentElement.LastChild);


tento

this.xmldoc["weby"].AppendChild(web);

Nahlásit jako SPAM
IP: 78.98.142.–
klinki0
Návštěvník
27. 9. 2008   #3
-
0
-

Nepomohlo to, dělá to úplně to samé jako předtím. (bude to pravděpodobně způsobené metodou save() třídy XmlDocument, která uloží celý XML dokument, já bych potřeboval nějakou fci která uloží jen změny)

Nahlásit jako SPAM
IP: 85.13.98.–
mnn
~ Anonymní uživatel
118 příspěvků
27. 9. 2008   #4
-
0
-

Vyskusal si to vobec? Ja ano a mne to funguje. Save metoda s tym nema nic spolocne. Nechaj si zobrazit vlastnost InnerXml pri ukladani suboru (mas tam cely obsah suboru, ktory sa ulozi). Hladaj chybu u seba (co sa tyka kodu)…

Nahlásit jako SPAM
IP: 78.98.142.–
klinki0
Návštěvník
28. 9. 2008   #5
-
0
-

Já to vyzkoušel a jak sem psal je to pořád to samé jako předtím. Možná si nepochopil co potřebuju... Já tam psal že nechci ukládat znovu celý dokument, ale přidat do něj pouze kousek kódu (konkrétně element <web> a jeho potomky). Vím jak si zobrazit pouze tento element s těmi potomky, ale mám problém s uložením do souboru. Nevím prostě jak to vložit mezi poslední tag </web> a
</weby> (umím si nastavit ukazatel v souboru před tag weby, ale problém je že vložený obsah ten tag přepíše)

Nahlásit jako SPAM
IP: 85.13.98.–
PaLaDiN
~ Anonymní uživatel
30 příspěvků
28. 9. 2008   #6
-
0
-

Tak ho jednoducho zapíš ešte raz a máš po probléme :D

Nahlásit jako SPAM
IP: 88.212.21.–
klinki0
Návštěvník
28. 9. 2008   #7
-
0
-

Hmm a co kdyby ten soubor měl 5GB? to ho budu držet v paměti a zapisovat znovu? V tomhle případě kdy má pár KB je to jedno, ale já se to chci naučit pořádně...

Nahlásit jako SPAM
IP: 85.13.98.–
mnn
~ Anonymní uživatel
118 příspěvků
28. 9. 2008   #8
-
0
-

5GB? tak logicky na tak velky objem dat radsej databazu. ostatne, nastuduj si zaklady xml……

Nahlásit jako SPAM
IP: 78.98.11.–
KIIV+42
God of flame
28. 9. 2008   #9
-
0
-

kdyby ten soubor mel 5GB tak driv pojdes nudou nez se ti neco nacte.. na to xml neni moc dobry

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
klinki0
Návštěvník
28. 9. 2008   #10
-
0
-

Moment... já tu mluvil o načítání nebo ukládání? Já mám problém s ukládáním... metodu na načtení xmldoc.Load(this.file); vůbec nepotřebuju, to byl jen příklad. Navíc proč bych měl studovat základy XML nebo databází když chci jen jednoduše aktualizovat XML soubor ?!! Těch 5GB byl zase jen příklad, proč není dobré řešení nechat to tak jak to je a zapsat to celé znovu.. Jinak databázi je dobré použít v případě kdy je to potřeba. Což zrovna tento případ není.

Nahlásit jako SPAM
IP: 85.13.98.–
mnn
~ Anonymní uživatel
118 příspěvků
28. 9. 2008   #11
-
0
-

pokial chces silou-mocou obchadzat xml pravidla, tak pomocou streamreaderu vyhladaj </weby> a zapis pred ten tag novy <web>...</web>

Nahlásit jako SPAM
IP: 78.98.11.–
klinki0
Návštěvník
28. 9. 2008   #12
-
0
-

:) to přesně chci :D Problém je, že nevím jak to udělat abych nepřepsal ten tag </weby> a na to sem se tady ptal...
(kdyby někdo chtěl napsat, že vložit znovu tag </weby> není problém, tak to opravdu není problém, ale já se to chci naučit pořádně :-) )

Nahlásit jako SPAM
IP: 85.13.98.–
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, 60 hostů

Podobná vlákna

Zpracování XML souboru — založil bodmrazu

Zpracování obrázku v C# — založil Petas

Zpracování formuláře — založil Tazatel

 

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