Jag håller på och gör ett skolprojekt där vi gör ett DVD-register och jag behöver kunna ta bort en specifik DVD. Det här borde fungera: Tack för hjälpen men jag skulle behöva hämta värdet till id='1' För att få fram id på en specifik film kan du t.ex först göra en sökning på namn: Jag är inte säker på att du förstod vad jag menade. Jag har låtit användaren välja vilken film som ska tas bort genom att de skriver in ID't, genom DVDid = int.Parse(console.ReadLine()); Har följande kod bortsett från DVDid som hämtas tidigare: Är det någon som vet vad som är fel? I ditt falll bör det funka med: Hur gick det, är problemet löst? Den klagar fortfarande, klistrar in hela funktionen här så kan du se ifall det är något annat fel: Får det här felmeddelandet: Felmeddelandet tyder på att du har använt DVDid-variabeln, på angiven rad i koden, utan att du har tilldelat den något värde. Jag får fortfarande följande felmeddelande: Det verkar ju som att du försöker läsa av DVDid någonstan i koden (Kolla i Program.cs rad 293, jag TROR det är det felmedelandet refererar till). Jag får det när jag kör koden Då måste du ju titta i koden ovanför där det slår stopp, du har alltså inte tilldelat något värde till DVDid när du kommer till det stälet där det går fel. Fick det att fungera nu, tack för all hjälpTa bort ett speciellt element i XML med hjälp av attribut
Så här ser strukturen ut i XML-filen:
<?xml version="1.0" encoding="iso-8859-1"?>
<Registry>
<dvd id="0">
<name>Another Cinderella Story</name>
<company>Warner</company>
<year>2008</year>
</dvd>
</Registry>
Jag har ID't som ska tas bort lagrad i en integer kallad DVDid. Det jag alltså vill göra är att jag vill ta bort DVD elementet med det valda IDet. hur gör jag? Jag har skrivit så här, men är inte klar.
/***** Börja ta bort *****/
// Initiera en ny instans av XmlDocument-klassen
XmlDocument xDoc = new XmlDocument();
// Laddar in XML-dokumentet (databasen)
xDoc.Load("Registry.xml");
// Välj noden som ska användas
XmlNode localnode = xDoc.SelectSingleNode("/Registry/dvd");
// Ta bort XML-noden
xDoc.DocumentElement.RemoveChild(xDoc.DocumentElement.ChildNodes[localnode]);
// Skapa filströmmen för att spara
FileStream Writer = new FileStream("Registry.xml", FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite);
// Spara XML-dokumentet
xDoc.Save(Writer);
// Stäng Writer
Writer.Close();
Är det någon som vet hur man lättast gör det här?Sv: Ta bort ett speciellt element i XML med hjälp av attribut
XmlDocument d = new XmlDocument();
d.Load(@"Registry.xml");
XmlNode t = d.SelectSingleNode("/Registry/dvd[@id='1']");
t.ParentNode.RemoveChild(t);
d.Save(@"Registry.xml");Sv:Ta bort ett speciellt element i XML med hjälp av attribut
ID't är lagrat i en variabel kallad DVDid, så behöver få värdet därifrån så att användaren kan välja vilken som ska tas bortSv: Ta bort ett speciellt element i XML med hjälp av attribut
XmlNode n = d.SelectSingleNode("/Registry/dvd/name[. ='Another Cinderella Story']");
Om filmen hittas kan du få ut id t.ex så här:
XmlAttribute a = n.ParentNode.Attributes["id"];
string id = a.Value;
En annan variant är, om du har möjlighet, att använda LINQ to XML! Exempelvis som nedan:
Definiera en klass DVD, t.ex:
public class DVD
{
public int Id { get; set; }
public string Name { get; set; }
public string Company { get; set; }
public int Year { get; set; }
}
Sedan göra sökning på filmnamn, t.ex:
List<DVD> dvd = (from xml2 in XDocument.Load(@"registry.xml").Elements("Registry").Elements("dvd")
where xml2.Element("name").Value == "Another Cinderella Story"
select new DVD
{
Id = Convert.ToInt32(xml2.Attribute("id").Value),
Name = xml2.Element("name").Value,
Company = xml2.Element("company").Value,
Year = Convert.ToInt32(xml2.Element("year").Value)
}).ToList();
Om du får någon träff så får du id exempelvis via:
dvd[0].IdSv:Ta bort ett speciellt element i XML med hjälp av attribut
DVDid = int.Parse(console.ReadLine());
Den variablen ska jag sedan använda för att välja ut vilken som ska raderas. Förstår du hur jag menar?Sv: Ta bort ett speciellt element i XML med hjälp av attribut
...
XmlNode t = d.SelectSingleNode(String.Format("/Registry/dvd[@id='{0}']", DVDid));
...
Det löser nog ditt problem.Sv:Ta bort ett speciellt element i XML med hjälp av attribut
// Initiera en ny instans av XmlDocument-klassen
XmlDocument xDoc = new XmlDocument();
// Laddar in XML-dokumentet (databasen)
xDoc.Load(@"Registry.xml");
// Välj noden som ska användas
XmlNode localnode = xDoc.SelectSingleNode(String.Format("/Registry/dvd[@id='{0}']", DVDid));
// Ta bort XML-noden
xDoc.ParentNode.RemoveChild(localnode);
// Har testat med localnode.ParentNode.RemoveChild(localnode); också
// Spara XML-dokumentet
xDoc.Save(@"Registry.xml");
Console.WriteLine("Du lyckades!!!");
Console.ReadKey();
Jag får följande felmeddelande när den kommer fram till // Ta bort XML-noden
NullReferenceException
Objektreferensen har inte angetts till en instans av ett objekt.
Något jag missat?Sv: Ta bort ett speciellt element i XML med hjälp av attribut
Sv:Ta bort ett speciellt element i XML med hjälp av attribut
xDoc.DocumentElement.RemoveChild(localnode);Sv: Ta bort ett speciellt element i XML med hjälp av attribut
Sv:Ta bort ett speciellt element i XML med hjälp av attribut
public void DeleteDisc()
{
// Deklarerar variabler
int DVDid, i, maxvarde;
bool trycatch;
trycatch = true;
// Frågar vilken DVD användaren vill ta bort
while (trycatch)
{
// Skriver ut Vilka filmer du har
Console.Write("ALTERNATIV:\n\n");
// Startar loopen för att skriva ut DVDernas Namn
for (i = 0; i < Registry.Count; i++)
{
SRegistry register = (SRegistry)Registry[i];
// Skriver ut resultatet
Console.Write("{0}. Namn:\t {1}\n", i, register.Name);
}
Console.Write("\n\nVilken DVD vill du ta bort?\n(ange talet innan DVDns namn)");
Console.Write("\n\nVal: ");
maxvarde = i - 1;
try
{
// kollar ifall användaren angett ett godkänt ID
DVDid = int.Parse(Console.ReadLine());
Console.Clear();
trycatch = false;
}
catch(Exception)
{
// Annars så kommer ett felmeddelande, och användaren får en ny chans
Console.Clear();
Console.WriteLine("Du måste ange ett värde mellan 0 och {0}", i);
Console.WriteLine("(Tryck på någon tangent för att fortsätta");
Console.ReadKey();
Console.Clear();
trycatch = true;
}
}
/***** Börja ta bort *****/
// Initiera en ny instans av XmlDocument-klassen
XmlDocument xDoc = new XmlDocument();
// Laddar in XML-dokumentet (databasen)
xDoc.Load(@"Registry.xml");
// Välj noden som ska användas
XmlNode localnode = xDoc.SelectSingleNode(String.Format("/Registry/dvd[@id='{0}']", 12));
// Ta bort XML-noden
//xDoc.ParentNode.RemoveChild(localnode);
xDoc.DocumentElement.RemoveChild(localnode);
// Spara XML-dokumentet
xDoc.Save(@"Registry.xml");
Console.WriteLine("Du lyckades!!!");
Console.ReadKey();
}Sv: Ta bort ett speciellt element i XML med hjälp av attribut
Error 1 Use of unassigned local variable 'DVDid' d:\mina dokument\Visual Studio 2008\Projects\Projekt B\Projekt B\Program.cs 214 97 Projekt BSv:Ta bort ett speciellt element i XML med hjälp av attribut
Jag körde ett litet test och så här fick jag det att funka.
<code>
public void DeleteDisc()
{
const string EXIT = "E";
// Initiera en ny instans av XmlDocument-klassen
XmlDocument xDoc = new XmlDocument();
// Laddar in XML-dokumentet (databasen)
xDoc.Load(@"Registry.xml");
// Frågar vilken DVD användaren vill ta bort
bool running = true;
while (running)
{
// Skriver ut Vilka filmer du har
Console.Write("ALTERNATIV:\n\n");
// Startar loopen för att skriva ut DVDernas Namn
foreach (XmlNode node in xDoc.DocumentElement)
{
//Console.Write("{0}. Namn:\t {1}\n", i, register.Name);
Console.WriteLine(String.Format("Id: {0}, {1}", node.Attributes["id"].Value ,node.InnerText));
}
Console.WriteLine("ange id-numret på någon DVD för att radera eller {0} för att avsluta", EXIT);
string inline = String.Empty;
inline = Console.ReadLine();
Console.Clear();
if (String.Compare(inline, EXIT, true) != 0)
{
int DVDid;
if (int.TryParse(inline, out DVDid))
{
Console.Clear();
/***** Börja ta bort *****/
// Välj noden som ska användas
XmlNode localnode = xDoc.SelectSingleNode(String.Format("/Registry/dvd[@id='{0}']", DVDid));
try
{
// Ta bort XML-noden
xDoc.DocumentElement.RemoveChild(localnode);
// Spara XML-dokumentet
xDoc.Save(@"Registry.xml");
Console.WriteLine(String.Format("Har raderat DVD med id {0}", DVDid));
}
catch
{
Console.WriteLine(String.Format("Kunde inte radera DVD med id {0}", DVDid));
}
}
else //Ogiltigt val
{
// Annars så kommer ett felmeddelande, och användaren får en ny chans
Console.Clear();
Console.WriteLine("Du måste ange id-numret på någon DVD.");
}
Console.WriteLine("press any key");
Console.ReadKey();
Console.Clear();
}
else //EXIT
{
running = false;
}
}
}
</code>Sv: Ta bort ett speciellt element i XML med hjälp av attribut
Error 1 Use of unassigned local variable 'DVDid' d:\mina dokument\Visual Studio 2008\Projects\Projekt B\Projekt B\Program.cs 293 97 Projekt BSv:Ta bort ett speciellt element i XML med hjälp av attribut
om du försöker
någonting = DVDid
så får du ett Error om du aldrig tilldelat DVDid något värde.
Se skillanden mellan
int DVDid;
något = DVDid
och
int DVDid
DVDid = ettVärde
något = DVDid.
Får du felmeddelandet när du kompilerar eller när du kör koden?Sv: Ta bort ett speciellt element i XML med hjälp av attribut
Sen undrar jag en sak här:
Console.WriteLine(String.Format("{0}. {1}", node.Attributes["id"].Value, node.InnerText));
Hur gör jag för att skriva ut ett specifikt element istället för alla element?Sv:Ta bort ett speciellt element i XML med hjälp av attribut
Angående att skriva ut ett specifikt element/node så kan du t ex göra så här
<code>
// Välj noden som ska användas
XmlNode localnode = xDoc.SelectSingleNode(String.Format("/Registry/dvd[@id='{0}']", DVDid));
try
{
// Ta bort XML-noden
xDoc.DocumentElement.RemoveChild(localnode);
// Spara XML-dokumentet
xDoc.Save(@"Registry.xml");
Console.WriteLine(String.Format("Har raderat DVD med id {0}", DVDid));
Console.WriteLine(String.Format("Filmen hette: {0}", localnode.SelectSingleNode("name").InnerText));
Console.WriteLine(String.Format("den var gjord av {0}", localnode.SelectSingleNode("company").InnerText));
Console.WriteLine(String.Format("år {0}", localnode.SelectSingleNode("year").InnerText));
}
catch
{
Console.WriteLine(String.Format("Kunde inte radera DVD med id {0}", DVDid));
}
</code>
Googla även lite på Xpath, sökfunktion för XML.
[Edit]
Här finns en liten artikel som t o m har en XML fil CD-info som exempel på hur man kan använda XPath i XML-dokument http://www.codeproject.com/KB/cpp/myXPath.aspxSv: Ta bort ett speciellt element i XML med hjälp av attribut