Eliminare i nodi di un certo tipo da un file XML con C#

venerdì 13 agosto 2010 - 22.12
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  Internet explorer 8.0

edo1080 Profilo | Newbie

Salve a tutti, ho un documento di questo tipo:

[CODE] <?xml version="1.0" encoding="UTF-8" ?> - <zucchine xmlns="ciccio"> <Id>urn:uuid:8f27991d-3adb-4a8f-9c7b-c655606bdd2e</Id> <Abaabababa>Fuffa</Abaabababa> <cacacacaca>2080-08-16T02:19:23+01:00</cacacacaca> <mustafa>pippo</mustafa> <Creator>Mamma</Creator> <alibaba>Nonno</alibaba> <pluto>Zio</pluto> - <plutino> <Id>1</Id> <LabelText>AA</LabelText> </plutino> <RatingList /> - <TopolinoList> - <Topolino> <Id>urn:uuid:da61bb01-016c-45b7-aaac-f6da986e9f0a</Id> - <Minnie> - <paperino> <Id>urn:uuid:b8776053-3cf5-47db-92bc-44b18db1cd4d</Id> <orazio>24 1</orazio> <clarabella>24958</clarabella> <peppa>192</peppa> <nonnapapera>24624</nonnapapera> <paperone>urn:uuid:3b36ccee-6b14-4f64-84a9-219c5ac6cf34</paperone> <claudio>6jLbJM6P62MO86T3qQy7iTuImPY=</claudio> <frutta>24 1</frutta> <verdura>2.39</verdura> </paperino> - <patate> <Id>urn:uuid:34c002a4-91bd-4a98-b0e4-81e6a7d5d752</Id> <orazio>24 1</orazio> <clarabella>24958</clarabella> <peppa>192</peppa> <nonnapapera>24624</nonnapapera> <paperone>urn:uuid:a8cc8278-a04b-4536-8c89-f82d7fc3fcfe</paperone> <claudio>FdiJNVTHJXTsxff7F/61OiFbCOs=</claudio> </patate> </Minnie> </Topolino> - <Topolino> <Id>urn:uuid:ee72a83f-9de8-412d-9ed4-c40f28fc1e65</Id> - <Minnie> - <paperino> <Id>urn:uuid:8c39ce5a-3516-41c9-8468-336f2263425a</Id> <orazio>24 1</orazio> <clarabella>30579</clarabella> <peppa>192</peppa> <nonnapapera>30245</nonnapapera> <paperone>urn:uuid:04fbf8a2-4848-4cf2-aa6b-493164f34323</paperone> <claudio>6SraImBYxsyTmgSrhgW6Vios5uk=</claudio> <frutta>24 1</frutta> <verdura>2.39</verdura> </paperino> - <patate> <Id>urn:uuid:9bb3290e-0526-49bc-bfc6-b9828f61c129</Id> <orazio>24 1</orazio> <clarabella>30579</clarabella> <peppa>192</peppa> <nonnapapera>30245</nonnapapera> <paperone>urn:uuid:3a108443-fa98-4d96-9325-65e71e61e5a9</paperone> <claudio>bqx6K0baRUvBUHezNRkaLQ2hc9U=</claudio> </patate> </Minnie> </Topolino> - <Topolino> <Id>urn:uuid:5d679210-1883-430d-87ea-b990cddb95fa</Id> - <Minnie> - <paperino> <Id>urn:uuid:c57a2e3b-3094-4ec5-bc51-ab34255fb59a</Id> <orazio>24 1</orazio> <clarabella>31726</clarabella> <peppa>192</peppa> <nonnapapera>31392</nonnapapera> <paperone>urn:uuid:ca303a56-e853-46b5-966a-6cfcda70d35f</paperone> <claudio>XL03UHrYQnNiiJ8DdytM+JWCSqk=</claudio> <frutta>24 1</frutta> <verdura>2.39</verdura> </paperino> - <patate> <Id>urn:uuid:f04737a9-a1ae-41cb-b9cc-d98c7a7c5dfc</Id> <orazio>24 1</orazio> <clarabella>31726</clarabella> <peppa>192</peppa> <nonnapapera>31392</nonnapapera> <paperone>urn:uuid:1634e32e-6add-4303-9655-bc11615a6032</paperone> <claudio>mSl0JIrB366sCma7Oft9dwCFqv4=</claudio> </patate> </Minnie> </Topolino> - <Topolino> <Id>urn:uuid:e1b0b76b-059d-458a-8c78-7cb53a67976c</Id> - <Minnie> - <paperino> <Id>urn:uuid:d5428a0c-d3bf-4db6-b620-d7ac861b4998</Id> <orazio>24 1</orazio> <clarabella>28741</clarabella> <peppa>192</peppa> <nonnapapera>28407</nonnapapera> <paperone>urn:uuid:3cad8310-01ce-4910-98f8-b0cad23ea621</paperone> <claudio>0ACI6cvFS6ByjRtfMeKgS0MuGj0=</claudio> <frutta>24 1</frutta> <verdura>2.39</verdura> </paperino> - <patate> <Id>urn:uuid:b70904e3-e78d-429f-bceb-b56767e168d3</Id> <orazio>24 1</orazio> <clarabella>28741</clarabella> <peppa>192</peppa> <nonnapapera>28407</nonnapapera> <paperone>urn:uuid:22f801a4-ec58-4e9a-bd87-ea14e53509b8</paperone> <claudio>S7hN3kkABeTf2eAuCG3puD+d17g=</claudio> </patate> </Minnie> </Topolino> - <Topolino> <Id>urn:uuid:9864be61-58c9-44d8-8c36-46366d11b067</Id> - <Minnie> - <paperino> <Id>urn:uuid:9f16145c-2322-466f-88ba-8f842232fe7f</Id> <orazio>24 1</orazio> <clarabella>28488</clarabella> <peppa>192</peppa> <nonnapapera>28154</nonnapapera> <paperone>urn:uuid:d098799f-c690-46c4-991d-561e4fa61747</paperone> <claudio>XwXFkt9pHOYQb5Y/k9gfZq4l5qY=</claudio> <frutta>24 1</frutta> <verdura>2.39</verdura> </paperino> - <patate> <Id>urn:uuid:5ab8a4f2-2a98-4da3-ab5a-3bd21b739356</Id> <orazio>24 1</orazio> <clarabella>28488</clarabella> <peppa>192</peppa> <nonnapapera>28154</nonnapapera> <paperone>urn:uuid:8d6dfbee-f798-495f-be42-5cb825e5692c</paperone> <claudio>1q9VI2ojAY4Efrqsg30hM42ZKzE=</claudio> </patate> </Minnie> </Topolino> - <Topolino> <Id>urn:uuid:9c7661d5-59b6-45c2-bfbe-c6717dfccb82</Id> - <Minnie> - <paperino> <Id>urn:uuid:13205cae-50eb-4878-a082-5b9a5df7af40</Id> <orazio>24 1</orazio> <clarabella>26463</clarabella> <peppa>192</peppa> <nonnapapera>25968</nonnapapera> <paperone>urn:uuid:2a1a2d88-ea12-41e2-b8a5-aff82fc2e62e</paperone> <claudio>RByY+rW7FJL3psYEp+MSawNbRyk=</claudio> <frutta>24 1</frutta> <verdura>2.39</verdura> </paperino> - <patate> <Id>urn:uuid:41f87154-fb74-494f-9070-e14bf79a774b</Id> <orazio>24 1</orazio> <clarabella>26463</clarabella> <peppa>192</peppa> <nonnapapera>25968</nonnapapera> <paperone>urn:uuid:65b276db-e2ac-432f-8df8-747cd26d8752</paperone> <claudio>CR3zt1mkesdmJtWbr8u0xPtepDg=</claudio> </patate> </Minnie> </Topolino> </TopolinoList> </zucchine> - <!-- Generated --> [/CODE]

Sto cercando un modo per fare un programmino C# con Visual Studio 2010 che mi consenta di riscriverlo identico ma senza i nodi:

<paperone>urn:uuid:65b276db-e2ac-432f-8df8-747cd26d8752</paperone>


non posso ovviamente semplicemente editarlo con frontpage perchè il contenuto cambia sempre, quello che resta fisso è solo

<paperone>-----</paperone>

Ho provato a fare un prog del tipo

[CODE]using System; using System.Xml; namespace Premove { class RemovePaperone { static void Main(string[] args) { string sorg = args[0]; XmlDocument dest = new XmlDocument(); dest.Load(sorg); XmlNodeList k = source.GetElementsByTagName("Paperone"); for (int i = 0; i < k.Count ; i++) { // Console.WriteLine(k[i].InnerXml); k[i].ParentNode.RemoveChild(k[i]); } dest.save("out.xml"); }}} [/CODE]

ma non funziona, o meglio mi leva solo una metà dei Paperone,


Ho provato anche con :

[CODE]XmlNodeList k = source.GetElementsByTagName("Paperone"); XmlNodeList a = source.GetElementsByTagName("Paperino"); XmlNodeList b = source.GetElementsByTagName("Patate"); for (int i = 0; i < k.Count ; i++) { // Console.WriteLine(k[i].InnerXml); // k[i].ParentNode.RemoveChild(k[i]); int c = i+i; a[i].RemoveChild(k[c]); b[i].RemoveChild(k[c++]); [/CODE]

ma la cosa non va lo stesso, anzi dice che i nodi selezionati non sono figli di quello padre.



Se rimuovo il commento, Il comando commentato // Console.WriteLine(k[i].InnerXml); però fornisce i valori giusti sul terminale.

Non so davvero come fare, grazie a tutti per l'aiuto.

Gho5t Profilo | Junior Member

c'erano un paio di errori nel primo codice...
1) >XmlNodeList k = source.GetElementsByTagName("Paperone");
la variabile source che era diventata sorg e non l'avevi cambiata

2) >XmlNodeList k = source.GetElementsByTagName("Paperone");
io utilizzo VS 2010 e la ricerca è case-sensitive, ma credo che questo ed il primo "errore" siano degli errori fatti mentre trascrivevi il tuo programma togliendo tutti i riferimenti reali...

3) >for (int i = 0; i < k.Count ; i++)
usavi sempre k.count per il tuo for, ma una volta che eliminavi un nodo, il valore di k.count diminuiva di 1... quindi, visto che c'erano 12 occorrenze di "paperone", nel momento in cui i arrivava a 6 k.count valeva 6 e quindi usciva dal ciclo, ovviamente quando stampavi, non eliminavi gli oggetti e quindi il k.count rimaneva sempre a 12...

4) >k[i].ParentNode.RemoveChild(k[i]);
devi sostituire il k[i] con k[0] perché arrivato al 7° elemento della lista da eliminare, generava un errore per lo stesso motivo del punto 3.

ecco il sorgente che funziona:
string sorg = args[0]; XmlDocument dest = new XmlDocument(); dest.Load(sorg); XmlNodeList k = dest.GetElementsByTagName("paperone"); int cont = k.Count; for (int i = 0; i < cont; i++) { // Console.WriteLine(k[i].InnerXml); k[0].ParentNode.RemoveChild(k[0]); } dest.Save("out.xml");
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5