Tja! Du måste göra en loop där du skriver ut ungefär detta för varje film du vill lägga till Så om jag redan har ett gäng filmer i filen så måste jag läsa in alla en array och sen skriva ut alla igen plus den nya? inte om du använder SAX, däremot går det ifall du använder DOM Har svårt att förstå varför databas inte skulle vara ett allternativ. Att använda en databas i detta fal kanske är lite overkill eftersom jag tror att det är en och endast en användare av programmet. Jag hade satsat på ett typat dataset. Viktor,XML och C#Windows forms
Har ett litet problem här.
Håller på med ett program som håller reda på bl.a filmer man har och tänkte använda XML för att lagra informationen i. Nu är det så att mitt program vägrar "fylla på" i xml filen och om jag kör metoden flera gånger så får jag fortfarande bara en film nod.
Skulle vilja ha hjälp med hur man får den att "fylla på".
Hittade en tutorial på nätet där jag tagit koden ifrån å försökt förstå den, förstår det mesta men hur man gör så han fyller på är för mig ett stort frågetecken.
Här är koden:
string FILE_NAME = "test.xml";
XmlTextWriter xmlWriter = null;
xmlWriter = new XmlTextWriter (FILE_NAME, null);
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.Indentation= 6;
xmlWriter.Namespaces = false;
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("", "db", "");
xmlWriter.WriteStartElement("", "film", "");
xmlWriter.WriteStartElement("", "Titel", "");
xmlWriter.WriteString("The Rock");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.Flush();
xmlWriter.Close();
Tack på förhand!
/Viktor
Sv: XML och C#Windows forms
xmlWriter.WriteStartElement("", "film", "");
xmlWriter.WriteStartElement("", "Titel", "");
xmlWriter.WriteString("The Rock"); //kan lämpligen bytas..
xmlWriter.WriteEndElement(); // slut på titel
xmlWriter.WriteEndElement(); // slut på film
Sv: XML och C#Windows forms
Tycker det borde finnas något lättare sätt... :)Sv:XML och C#Windows forms
(är dock inte så hemma i .net frameworket så du får lov och söka lite). Dock så vid användning av DOM så laddas hela trädet i minnet, så för extremt stora xml filer är det kanske inte att rekommendera, å andra sidan i så fall är XML kanske inte det bästa alternativet heller..Sv: XML och C#Windows forms
Sv:XML och C#Windows forms
Sv: XML och C#Windows forms
Nu ska vi titta på en lite mer spännande lösning för hur man skulle kunna gå tillväga för att arbeta med, samt spara ner filmerna. Eftersom vi arbetar med en utvecklingsplatform som är <b>objektorienterad</b> så är det lämpligt, och att föredra att kunna hålla sig i den.
Det vi skall använda oss av är något som kallas för XML Serializering, vilket innebär att man omvandlar ett <b>objekt</b> till xml (och tillbaka om man vill/behöver). Jag vill påpeka att detta <b>exempel</b> innehåller en hel del <b>slarvig</b> kod så som direkt åtkomst på fält etc, men jag valde att använda det för att kunna hålla exemplet kort, lätt läst, men ändå så att det förmedlar vad som är möjligt.
Vi börjar med att skapa en <b>klass</b> som representerar en film, denna skulle kunna (mycket enkelt) se ut enligt följande.
public class Film
{
public string artal;
public string titel;
// Måste finnas en 'default' kontruktor
public Film()
{
}
public Film(string artal, string titel)
{
this.artal = artal;
this.titel = titel;
}
}
Som du set är fälten <b>artal</b> och <b>titel</b> satt till publika, detta använde jag här för att xml serializatorn kan läsa av dem direkt då, vi behöver inte instuera den om mer komplexa relationer. Klassen i sig är inte på något sätt komplicerad, den innehåller en kontruktor som tillåter oss att sätta årtal och titel direkt vid skapandet - så att det blir enklare att arbeta med.
Nästa sak vi måste göra är att skapa en klass som representerar listan över filmer som vi har tillgängliga. Detta gör vi gemom att skapa en klass med namnet <b>FilmLista</b>. Vi bygger den i två steg så att den inte blir för komplicerad vid första anblick.
public class FilmLista
{
[XmlArray("Filmer"), XmlArrayItem("Film", typeof(Film))]
public ArrayList filmer;
public FilmLista()
{
this.filmer = new ArrayList();
}
}
Klassen innehåller en lista (av typen <b>ArrayList</b>) över filmer som vi har. Det som är lite speciellt här är att fältet har tilldelats två <b>attribut</b> vid namnen <b>XmlArray</b>,som säger att fältet skall behandlas som en array och att den skall representeras av taggen <b>Filmer</b> i vår xml - samt <b>XmlArrayItem</b> som säger att vår array innehåller objekt av typen <b>Film</b> samt att de ska presenteras med namnet <b>Film</b> i xml-filen.
Ok, så nu kan vi skapa en filmlista och lägga till filmer med den med följande kod.
FilmLista lista = new FilmLista();
lista.filmer.Add(new Film("1999", "Min film"));
lista.filmer.Add(new Film("2000", "The Roclk"));
Nästa steg är att kunna <b>spara</b> listan till en xml fil. För att göra detta lägger vi till en <b>metod</b> med namnet <b>Spara</b> i klassen <b>FilmLista</b>. Denna metod kommer att ha till uppgift att genomföra själva <b>xml serilizeringen</b> (konvertering från Objekt -> XML), samt att spara ner det till en fil, vars namn vi skickar med in.
public class FilmLista
{
[XmlArray("Filmer"), XmlArrayItem("Film", typeof(Film))]
public ArrayList filmer;
public FilmLista()
{
this.filmer = new ArrayList();
}
public bool Spara(string filNamn)
{
FileStream xmlFil = new FileStream(filNamn, FileMode.OpenOrCreate);
try
{
XmlSerializer serializer =
new XmlSerializer(typeof(FilmLista));
serializer.Serialize(xmlFil, this);
}
catch(Exception ex)
{
return false;
}
finally
{
xmlFil.Close();
}
return true;
}
}
Väldigt enkel och lätt läst kod här. Vid det här laget kan det vara lämpligt att läsa på lite i dokumentationen om vad det är som sker här, men det borde inte vara så svårt att få en överblick. När vi hart denna metoden så använder vi den på följande sätt.
FilmLista lista = new FilmLista();
lista.filmer.Add(new Film("1999", "Min film"));
lista.filmer.Add(new Film("2000", "The Roclk"));
if( lista.Spara("FilmLista.xml") )
Console.WriteLine("Sparade filmerna");
else
Console.WriteLine("Kunde inte spara filmerna!");
Resultatet blir då att filmerna sparas ner i en fil med namnet <b>FilmLista.xml</b> som ser ut som följande om du öppnar den.
<?xml version="1.0"?>
<FilmLista xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Filmer>
<Film>
<artal>1999</artal>
<titel>Min film</titel>
</Film>
<Film>
<artal>2000</artal>
<titel>The Roclk</titel>
</Film>
</Filmer>
</FilmLista>
Volia! Enkalt och snyggt va? Mycket trevligare än att "manuellt" skapa xml-filen med kod. Det är väldigt enkelt när man bygger ut informationen i t.ex Film klassen. Lägg till den nya informationen så sparas den automatiskt när du sparar.
Det finns attribut som man kan använda för att säta till att saker inte skall tas med vid serializering, samt att det finns en metod på klassen <b>XmlSerializer</b> som heter <b>Deserialize</b> som gör det omvända (XML -> Objekt) som skulle kunna användas för en funktion för att ladda in filmlistan igen.
Hoppas det gav några idéer på hur du kan gå vidare!