Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Non ho mai imparato ad usare XmlDocuments o HtmlDocuments, perché ogni volta che ho iniziato, poi avevo delle incompatibilità, XML troppo vecchi o troppo nuovi, oppure dialetti dedicati... Se nessuno ci illumina con un esempio, partendo dal tuo Xml, un grazie anticipato
Però non mi sono mai scoraggiato, un Xml è un file testo e trattandolo come tale si possono fare tutte le operazioni pensabili.
Ho scritto due righe. Su un nuovo progetto winform aggiungi un bottone ed una textbox:
Codice sorgente - presumibilmente VB.NET
Imports System.IO
PublicClass Form1
Dim XML AsString
Dim pos1 AsInteger
Dim pos2 AsInteger
Dim NodoOUT AsString
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
Il programma apre il file: XUSB.XML, che deve esistere nella stessa cartella dell'eseguibile.
Individua i nodi e ne mostra il contenuto, ora nella textbox puoi modificare quello che vuoi, anche aggiungere o togliere una riga PletteRemap.
Cliccando il Button, un nuovo file viene salvato di nome: XUSBmod.XML, sempre nella cartella che contiene l'eseguibile.
Partendo da questo esempio, puoi ampliarlo per ottenere una serie di textbox dove modificare i valori, magari controllando anche la validità dell'input, automatizzare prendendo i valori da dove vuoi, aggiungere una ShowOpen e una ShowSave ecc ecc.
Credo che se anche sapessi padroneggiare XmlDocuments e XmlNode, per una modifica così semplice non li userei.
Ultima modifica effettuata da Carlo il 26/06/2021 alle 23:15
Ciao Carlo
Grazie per l'esempio che funziona modificando i dati dalla textbox.
Come avevi intuito io devo modificare i dati in automatico , e non manualmente .
Avevo quindi pensato una soluzione del genere , ma mi da un errore e non capisco perchè.
Ho prima provato il tuo esempio per vedere se il file modificato era riconosciuto e fino qui tutto ok .
Ho poi pensato di modificare i vari campi che devo modificare, e forse qui mi sono complicato la vita , ma mi sembra la soluzione più logica. Ho caricato la parte del file che veniva visualizzato nella textbox in una variabile stringa( testo1), ho poi creato un xml e l'ho popolato con testo1. A questo punto ho cercato di modificare i vari nodi , ma mi compare l'errore qui di sotto . Evidenziata la riga riportata
System.NullReferenceException: 'Riferimento a un oggetto non impostato su un'istanza di oggetto.'
Dim xmlElem As Xml.XmlNodeList = xmlFile.ChildNodes(1).ChildNodes
Allego la parte di listato che ho modificato .
Codice sorgente - presumibilmente VB.NET
PrivateSub Button1_Click(sender AsObject, e As EventArgs)Handles Button1.Click
Come ti avevo detto, non ho dimestichezza con le istruzioni dedicate, perchè, se si padroneggia la manipolazione delle stringhe le istruzioni dedicate sono inutili per compiti semplici, il discorso cambia con HTML o XML complessi, ma ad oggi non ne ho mai sentito la necessità.
Restando nell'ambito della manipolazione delle stringhe hai due possibilità, una adatta se il nodo ha un'impostazione fissa, cioè il valore da cambiare si trova sempre nella stessa posizione nel nodo, la seconda è andare a caccia della posizione del valore da cambiare con IndexOf, usando lo stesso metodo che ho usato per trovare: HeadOffsetRegisters.
Nel primo esempio ti mostro come fare presumendo che i valori da cambiare si trovino sempre nella stessa posizione nel nodo, ho aggiunto tre buttons che simulano l'automazione:
Codice sorgente - presumibilmente VB.NET
Imports System.IO
PublicClass Form1
Dim XML AsString
Dim pos1 AsInteger
Dim pos2 AsInteger
Dim NodoOUT AsString
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
Dim pos = XML.IndexOf("<PaletteRemap0")' indice del nome
XML = XML.Remove(pos +37, 1).Insert(pos +37, NuovoValore0)' sostituzione vecchio valore con il nuovo
pos = XML.IndexOf("<PaletteRemap1")' indice del nome
XML = XML.Remove(pos +37, 1).Insert(pos +37, NuovoValore1)' sostituzione vecchio valore con il nuovo
pos = XML.IndexOf("<PaletteRemap2")' indice del nome
XML = XML.Remove(pos +37, 1).Insert(pos +37, NuovoValore2)' sostituzione vecchio valore con il nuovo
File.WriteAllText("XUSBmod.XML", XML)' scrittura XML con i valori di PaletteRemap0/1/2 modificati
EndSub
Se il valore di PaletteRemap può avere anche due o più cifre, bisogna aggiungere una riga che ne riconosca il numero delle cifre e su remove, invece di 1, bisogna mettere il numero delle cifre trovate.
Resto sempre dell'avviso che mi piacerebbe vedere come fare la stessa cosa con XmlDocuments, XmlNode, XmlNodeList e ChildNodes.
Ultima modifica effettuata da Carlo il 28/06/2021 alle 0:19
Buon giorno Carlo Questa sera vedo di provare i due esempi. Sinceramente il secondo esempio è quello che hai tentato di fare senza successo. Appena li provo ti faccio sapere. Grazie e buona giornata.
Ciao Carlo
prima di tutto vorrei scusarmi , questa mattina ho scritto il messaggio in fretta e non mi sono reso conto che il correttore ha cambiato una parola "Sinceramente il secondo esempio è quello che hai tentato di fare senza successo", io non ero riuscito a farlo , tu ci sei riuscito benissimo , scusa e grazie .
Ho modificato il tuo secondo esempio e adesso mi piace
Codice sorgente - presumibilmente VB.NET
PrivateSub Button4_Click(sender AsObject, e As EventArgs)Handles Button4.Click
Dim NuovoValore =7' nuovo valore
Dim indice AsInteger= 1
Dim testo AsString
While indice <= 7
XML =File.ReadAllText(" C:\Digitalframe\XUSB.xml")' carico il file
testo ="<PaletteRemap"& indice ' compongo l'indice del nome
Dim pos = XML.IndexOf(testo)' indice del nome
XML = XML.Remove(pos +37, 1).Insert(pos +37, NuovoValore)' sostituzione vecchio valore con il nuovo
File.WriteAllText("C:\Digitalframe\XUSB.xml", XML)' scrittura XML con i valori di PaletteRemap modificati
indice += 1
EndWhile
EndSub
Devo riscrivere ogni volta lo stesso file, altrimenti mi ritrovo che ha modificato solo l'ultima voce . Ma questo non è un problema , anzi, a pensarci deve essere cosi .
In realtà, il primo deve sempre essere a 0. Gli altri 7 possono variare da 1 a 7. Non l'ho capito bene, domani dal PC me lo studio. Se pos lo setto a 1 e il ciclo for lo inizio da 1, dovrei essere a posto. Grazie Carlo, domani me lo studio.
I valori li puoi mettere in un array, se il primo deve essere 0 lo imposti a zero:
Codice sorgente - presumibilmente VB.NET
Dim valori(7)AsInteger
valori(0)=0'il vlore che andrà su PaletteRemap0
valori(1)=7'il vlore che andrà su PaletteRemap1
'...
valori(7)=7'il vlore che andrà su PaletteRemap7
Dim pos asinteger= 0
For p = 0 To7
pos = XML.IndexOf("<PaletteRemap"& p.ToString, pos)' indice del nome progressivo
XML = XML.Remove(pos +37, 1).Insert(pos +37, valori(p))' sostituzione con il valore voluto
Next
Il pos su: XML.IndexOf("<PaletteRemap" & p.ToString, pos) serve ad indicare ad IndexOf la posizione di ricerca di partenza, se viene omesso la ricerca avviene sempre dall'inizio.
Ultima modifica effettuata da Carlo il 29/06/2021 alle 0:09