C# xml.... come scrivere senza cancellare i dati già inseriti?

giovedì 23 febbraio 2006 - 18.21

88mav Profilo | Newbie

come posso scrivere su un file xml già scritto?
voglion aggiungere ad un xml già scritto dei dati nuovi senza cancellare quelli precedenti...
come posso fare?

Cteniza Profilo | Guru

Essendo un file di tipo sequenziale con i records (righe) a lunghezza variabile è impossibile riscriverne porzioni, devi prima leggerlo tutto e poi riscriverlo tutto.

88mav Profilo | Newbie

puoi farmi un esempio per come devo fare?

io per ora ho letto tutte le righe del mio xml e le ho inserite in un array list; solo che ora mi sorge il problema di andare a scirvere, perchè non sono più divisi in comment, startelement, elementstring, ecc.........
come faccio?

in partica cmq io ho questo documento xml

<?xml version="1.0" ?>
- <!-- Kmask
-->
- <tasti>
<Testo>Calcolatrice</Testo>
<Percorso>C:\WINDOWS\System32\calc.exe</Percorso>
<Testo>Notepad</Testo>
<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>
<Percorso>C:\\WINDOWS\\system32\\cmd.exe</Percorso>
<Testo>Tastiera</Testo>
<Percorso>C:\\WINDOWS\\system32\\osk.exe</Percorso>
</tasti>


e vorrei aggiungerci sotto questo

<sec_tasti>
<Testo>Calcolatrice</Testo>
<Percorso>C:\WINDOWS\System32\calc.exe</Percorso>
<sec_tasti>

pascual Profilo | Newbie

Credo che forse puoi risolvere qcon qualcosa del genere

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load("path\\file.xml");

System.Xml.XmlElement newNode = doc.CreateElement("sec_tasti");
string xPath = "//tasti";
System.Xml.XmlNode nodo = doc.SelectSingleNode(xPath);

nodo.AppendChild(newNode);

xPath = "//sec_tasti";
System.Xml.XmlNode myNode = doc.SelectSingleNode(xPath);

System.Xml.XmlElement newChild = doc.CreateElement("Testo");
newChild.InnerText = "Calcolatrice";

System.Xml.XmlElement newChild_2 = doc.CreateElement("Percorso");
newChild_2.InnerText = "C:\\WINDOWS\\System32\\calc.exe";

myNode.AppendChild(newChild);
myNode.AppendChild(newChild_2);

doc.Save("path\\file.xml");
Ogni domenica puoi vincere o perdere. La questione e': sei capace di fare entrambe le cose da uomo?

88mav Profilo | Newbie

nella seconda riga di codice mi da un errore dicendo che il token non è valido

88mav Profilo | Newbie

ho corretto avevo sbagliato io adesso va;

invece se volgio rimuovere una parte ????????

tipo da questo

<?xml version="1.0"?>
<!--Kmask-->
<tasti>
<Testo>Calcolatrice</Testo>
<Percorso>C:\WINDOWS\System32\calc.exe</Percorso>
<Testo>Notepad</Testo>
<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>
<Percorso>C:\\WINDOWS\\system32\\cmd.exe</Percorso>
<Testo>Tastiera</Testo>
<Percorso>C:\\WINDOWS\\system32\\osk.exe</Percorso>
</tasti>


voglio togliere :

<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>

come faccio?

88mav Profilo | Newbie

ho corretto avevo sbagliato io adesso va;

invece se volgio rimuovere una parte ????????

tipo da questo

<?xml version="1.0"?>
<!--Kmask-->
<tasti>
<Testo>Calcolatrice</Testo>
<Percorso>C:\WINDOWS\System32\calc.exe</Percorso>
<Testo>Notepad</Testo>
<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>
<Percorso>C:\\WINDOWS\\system32\\cmd.exe</Percorso>
<Testo>Tastiera</Testo>
<Percorso>C:\\WINDOWS\\system32\\osk.exe</Percorso>
</tasti>


voglio togliere :

<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>

come faccio?

88mav Profilo | Newbie

ho corretto avevo sbagliato io adesso va;

invece se volgio rimuovere una parte ????????

tipo da questo

<?xml version="1.0"?>
<!--Kmask-->
<tasti>
<Testo>Calcolatrice</Testo>
<Percorso>C:\WINDOWS\System32\calc.exe</Percorso>
<Testo>Notepad</Testo>
<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>
<Percorso>C:\\WINDOWS\\system32\\cmd.exe</Percorso>
<Testo>Tastiera</Testo>
<Percorso>C:\\WINDOWS\\system32\\osk.exe</Percorso>
</tasti>


voglio togliere :

<Percorso>C:\\WINDOWS\\system32\\notepad.exe</Percorso>
<Testo>Dos</Testo>

come faccio?

pascual Profilo | Newbie

Non è il max nn avendo attributi che identificano il nodo ma dovrebbe andare

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load("path\file.xml");

string xPath = "//Testo";
System.Xml.XmlNodeList lista = doc.SelectNodes(xPath);
foreach(System.Xml.XmlNode nodo in lista)
{
if(nodo.InnerText.Equals("Dos"))
{
nodo.ParentNode.RemoveChild(nodo);
}
}

xPath = "//Percorso";
lista = doc.SelectNodes(xPath);
foreach(System.Xml.XmlNode nodo in lista)
{
if(nodo.InnerText.Equals("C:\\\\WINDOWS\\\\system32\\\\notepad.exe"))
{
nodo.ParentNode.RemoveChild(nodo);
}
}
doc.Save("path\\file.xml");

Dpvrebbe andare bene con un solo cilco esguendo l'xpath con questa query //Testo|Percorso ma nn ne sono sicuro
Ogni domenica puoi vincere o perdere. La questione e': sei capace di fare entrambe le cose da uomo?

88mav Profilo | Newbie

grazie mille pero ho bisogna ancora di una cosa se puoi
ho bisogno che passandogli solo il nome mi tolga anche l'indirizzo.

cioè se gli passo dos, mi toilga oltro che al nome ance il suoi indirizzo

pascual Profilo | Newbie

se hai la sicurezza che il nodo con l'indirizzo sia quello successivo al nodo con il nome allora basta aggiungere
nodo.ParentNode.RemoveChild(nodo.NextSibling);
prima di
nodo.ParentNode.RemoveChild(nodo);
Ogni domenica puoi vincere o perdere. La questione e': sei capace di fare entrambe le cose da uomo?

88mav Profilo | Newbie

io ho scritto questo

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load("DateMask.xml");

string xPath = "//Testo";
System.Xml.XmlNodeList lista = doc.SelectNodes(xPath);
foreach(System.Xml.XmlNode nodo in lista)
{
if(nodo.InnerText.Equals(txtNome.Text))
{
nodo.ParentNode.RemoveChild(nodo);
}
}

xPath = "//Percorso";
lista = doc.SelectNodes(xPath);

foreach(System.Xml.XmlNode nodo in lista)
{

nodo.ParentNode.RemoveChild(nodo.NextSibling);
nodo.ParentNode.RemoveChild(nodo);
}


doc.Save("DateMask.xml");


mi da un errore dopo l'esecuzione su questa riga
nodo.ParentNode.RemoveChild(nodo.NextSibling);

pascual Profilo | Newbie

facendo così devi levare il secondo ciclo perchè elimini tutto nel primo...
la remove del nextsibiling la devi fare nel primo ciclo
Ogni domenica puoi vincere o perdere. La questione e': sei capace di fare entrambe le cose da uomo?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5