Archief - [PROG][C#] xml bestanden

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

sabaoth

Legacy Member
Ik ben een soort site generator aan het maken, google pages achtig. Mijn systeem zou ik graag in elkaar steken met XML bestanden. Elke site heeft een xml bestand met daarin de paginas, met naam inhoud,... Ik weet wel ongeveer hoe ik een XML bestand maak in C# maar mijn probleem is het volgende:

Elke keer als een gebruiker een Nieuwe pagina aanmaakt moet het programma deze wegschrijven. Maar nu weet ik niet juist hoe ik een nieuw item toevoeg in een al bestaand XML bestand.

bv. ik heb dit bestand:
deSite.xml
Code:
<?xml version="1.0" coding="UTF-8"?>
<site>
      <page titel="Home" inhoud="blabla" />
</site>

nu zou mijn programma een nieuwe <page ... /> moetten maken. :help:

Cakeman

Legacy Member
Het is weer even geleden dat ik nog met XML gewerkt heb dus het zou kunnen dat onderstaande niet volledig klopt. Vooral omdat ik het uit mijn hoofd schrijf :)

Code:
using System.Xml;

XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("JeXmlBestand.xml");

XmlElement xePage = xd.CreateElement("page");
XmlAttribute xaTitel = xd.CreateAttribute("titel");
XmlAttribute xaInhoud = xd.CreateAttribute("inhoud");

xaTitel.value = "Hier komt je titel";
xaInhoud.value = "Hier komt je inhoud";

xePage.Attributes.Add(xaTitel);
xePage.Attributes.Add(xaInhoud);

xd.DocumentElement.AppendChild(xePage);

xd.Save(Server.MapPath("JeXmlBestand.xml");

sabaoth

Legacy Member
dus eigelijk als ik een xml file load. Kan ik er gwn met xmlwriter command er terug in schrijven? :)

Cakeman

Legacy Member
Ik ben niet 100% zeker, maar de XmlWriter class is enkel voor het wegschrijven van nieuwe bestanden denk ik. Met een XmlWriter class kan je niets toevoegen aan bestaande bestanden.

sabaoth

Legacy Member
Cakeman zei:
Code:
using System.Xml;

XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("JeXmlBestand.xml");

XmlElement xePage = xd.CreateElement("page");
XmlAttribute xaTitel = xd.CreateAttribute("titel");
XmlAttribute xaInhoud = xd.CreateAttribute("inhoud");

xaTitel.value = "Hier komt je titel";
xaInhoud.value = "Hier komt je inhoud";

xePage.Attributes.Add(xaTitel);
xePage.Attributes.Add(xaInhoud);

xd.DocumentElement.AppendChild(xePage);

xd.Save(Server.MapPath("JeXmlBestand.xml");

Als ik dit stukje code doe krijg ik deze error
(bij xd.DocumentElement.AppendChild(xePage); )

This document already has a 'DocumentElement' node.

Cakeman

Legacy Member
Dat is vreemd. Kan je je volledige code en de inhoud van je XML bestand eens posten?

Skarr

Legacy Member
je moet toch eerst een root item specifieren ? daar mag er maar 1 van zijn...

sabaoth

Legacy Member
Mijn code is nu wel in gewone vb.net ik had probleme met C#
Dit deel maakt het XML bestand aan:

Code:
 Dim site As New System.Xml.XmlDocument()
        Dim writer As New System.Xml.XmlTextWriter(currentPath, System.Text.Encoding.UTF8)

        writer.Formatting = Xml.Formatting.Indented
        writer.WriteStartDocument()

        writer.WriteStartElement("site")
        writer.WriteStartElement("page")
        writer.WriteAttributeString("titel", "Home")
        writer.WriteAttributeString("inhoud", "Dit is de inhoud van de home pagina")
        writer.WriteEndElement()
        writer.WriteEndElement()

        writer.Close()

Dit zou een <page... /> moetten toevoegen

Code:
Dim site As New Xml.XmlDocument

        If currentPath = Nothing Then Exit Sub
        site.Load(currentPath)

        Dim ele As Xml.XmlElement = site.CreateElement("page")
        Dim atri1 as Xml.XmlAttribute = site.CreateAttribute("titel")
        Dim atri2 as Xml.XmlAttribute = site.CreateAttribute("inhoud")

        atri1.value = txtPageTitle.text
        atri2.value = "boem"

        site.AppendChild(ele)        

        site.Save(currentPath)

Cakeman

Legacy Member
site.AppendChild(ele)

Met die regel ga je het element als root proberen te adden en dat gaat niet, want je document heeft inderdaad al een rootnode.

Probeer eens site.DocumentElement.AppendChild(ele)

sabaoth

Legacy Member
Ok er komt iets bij in het xml bestand maar dan is het dit
<stamp />ingevoerde tekst

hmm :p

*edit*
hola nee, mij fout :p het werkt denk ik, maar hij zet de attributes nog niet juist.

sabaoth

Legacy Member
het is me gelukt !! :)

Code:
        Dim site as new Xml.XmlDocument
        if currentPath = Nothing Then Exit Sub
        site.Load(currentPath)

        Dim ele As Xml.XmlElement = site.CreateElement("page")
        Dim atri1 As Xml.XmlAttribute = site.CreateAttribute("titel")
        Dim atri2 As Xml.XmlAttribute = site.CreateAttribute("inhoud")

        atri1.Value = txtPageName.Text
        atri2.Value = "boem"

        site.DocumentElement.AppendChild(ele)
        site.DocumentElement.LastChild.Attributes.Append(atri1)
        site.DocumentElement.LastChild.Attributes.Append(atri2)

        site.Save(currentPath)

Bedankt voor de hulp :) Maar nu nog iets :p zou het ook mogelijk zijn om dinge te verwijderen?? :p

Cakeman

Legacy Member
sabaoth zei:
Bedankt voor de hulp :) Maar nu nog iets :p zou het ook mogelijk zijn om dinge te verwijderen?? :p
Nee, in .NET kan je jammer genoeg enkel nodes toevoegen, niet verwijderen :(

Grapje natuurlijk :)

Het enige wat je moet doen om een element te verwijderen, meegeven welk element verwijderd moet worden.

Je kan op verschillende manieren een element selecteren. Door met een for(each) loop door je elementen te loopen of bijvoorbeeld door een XPath query.

Het nadeel van met for-loops te werken is dat je geen elementen kan verwijderen tijdens de loop. Dan zou je immers de collection waardoor je aan het loopen bent aanpassen en dat kan vervelende gevolgen hebben.

Een XPath query is dan het handigst.

Code:
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("JeXmlBestand.xml");

XmlNode xn = xd.DocumentElement.SelectSingleNode("/site/page[@titel='Home']");
if(xn != null)
{
    xd.DocumentElement.RemoveChild(xn);
    xd.Save(Server.MapPath("JeXmlBestand.xml");
}

Met de regel XmlNode xn = xd.DocumentElement.SelectSingleNode("/site/page[@titel='Home']"); ga je in je site-element het eerste page-element selecteren dat als titel-attribuut 'Home' heeft.

Met XPath kan je nog véél meer. Hier kan je onder andere wat meer lezen: http://msdn.microsoft.com/msdnmag/issues/0700/xml/

sabaoth

Legacy Member
Owla! probleem, weet iemand toevallig hoe ik attributen van een al bestaande node kan aanpassen??! ik vind het nie :s :(

Obliv`

Legacy Member
Misschien moet je op MSDN even de API's van de System.Xml namespace doorbladeren. Vooral van de klasse XmlDocument.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan