[c#] ReplaceChild ArgumentException

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:52
Hallo allemaal,

Ik heb nu toch iets vreemds waar ik echt helemaal niets van begrijp! Het gaat over de XmlNode.ReplaceChild. In de onderstaande code krijg ik een foutmelding bij genoemde functie (regel 4), te weten een ArgumentException (Het knooppunt dat moet worden verwijderd, is geen onderliggend knooppunt van dit knooppunt.).

C#:
1
2
3
4
5
6
// Oude node met rollen vervangen door nieuwe node
XmlNode organizationNode = node.SelectSingleNode("Organization");
XmlNode sourceRolesNode = organizationNode.SelectSingleNode("Roles");
organizationNode.ReplaceChild(sourceRolesNode, targetRolesNode);
//organizationNode.RemoveChild(sourceRolesNode);
//organizationNode.AppendChild(targetRolesNode);


Zoals je ziet heb ik daaronder (regel 5/6) twee regels toegevoegd en die gecomment, en het vreemde is dat die dus wél werken!! Je zou verwachten dat ReplaceChild niets anders zou doen dan verwijderen en toevoegen op de oorspronkelijke positie (in feite natuurlijk niet bijzonder anders dan op een andere positie). Daarom kan ik hier met mijn verstand niet bij, en op internet is er ook niets over te vinden (de foutmelding is natuurlijk ook erg onduidelijk, want het verwijderen lukt wél!).

Overigens gaat het in beide gevallen om een XmlElement, dus niet dat ik een XmlAttribute wil vervangen door een XmlElement of iets in die richting. Sterker nog, als ik ze expliciet als XmlElement benoem in plaats van XmlNode levert dat ook geen succes op.

Wie weet wat hier mis is? Ligt dit aan mij of zit hier een bug in c#?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 18:59

Haan

dotnetter

Waar komt de 'targetRolesNode' vandaan? Aan de foutmelding te zien is daar wat mis mee. Heb je de documentatie van de ReplaceChild methode goed bekeken?

Je hebt ook niet per ongeluk de parameters verkeerd om staan? (eerst de nieuwe node, dan de oude node, aan je regel 5 en 6 te zien lijkt het alsof je het nu verkeerd om doet)

offtopic:
ps. probeer de foutmeldingen in het Engels te krijgen, NL foutmeldingen kan je helemaal niks mee als je die op wilt zoeken. Ik heb hier op GoT weleens een manier voorbij zien komen om dat te doen zonder je hele OS in het Engels te moeten installeren.

[ Voor 49% gewijzigd door Haan op 06-05-2009 11:39 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
In de documentatie staat dat de ArgumenException gegooid word als
The newChild was created from a different document than the one that created this node.

This node is read-only.

The oldChild is not a child of this node.
Het is overigens handiger als je je language pack deinstalleert zodat je weer engelse exceptions krijgt. Dat is makkelijker googlen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:52
Haan schreef op woensdag 06 mei 2009 @ 11:35:
Waar komt de 'targetRolesNode' vandaan? Aan de foutmelding te zien is daar wat mis mee. Heb je de documentatie van de ReplaceChild methode goed bekeken?
Die heb ik bekeken, maar bijster veel informatie kan ik daar niet vinden. Zeker niet iets wat ik verkeerd zou doen.
Je hebt ook niet per ongeluk de parameters verkeerd om staan? (eerst de nieuwe node, dan de oude node)
Nee :).
offtopic:
ps. probeer de foutmeldingen in het Engels te krijgen, NL foutmeldingen kan je helemaal niks mee als je die op wilt zoeken. Ik heb hier op GoT weleens een manier voorbij zien komen om dat te doen zonder je hele OS in het Engels te moeten installeren.
offtopic:
Ja, de oplossing is .net framework Engels installeren volgens mij.

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:52
Woy schreef op woensdag 06 mei 2009 @ 11:40:
In de documentatie staat dat de ArgumenException gegooid word als
Ik zag het ja. Alledrie is uit te sluiten omdat anders het los verwijderen en toevoegen ook niet zou werken, maar dat lukt wél! 8)7.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 18:59

Haan

dotnetter

Weet je het heel zeker? In ieder geval doe je in regel 5 en 6 precies andersom wat je in regel 4 doet, dus iets klopt daar niet..

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dennis schreef op woensdag 06 mei 2009 @ 11:42:
[...]

Ik zag het ja. Alledrie is uit te sluiten omdat anders het los verwijderen en toevoegen ook niet zou werken, maar dat lukt wél! 8)7.
Het verschil met de Remove/Append en de ReplaceChild methode is dat ReplaceChild het volgende doet
C#:
1
2
3
4
XmlNode nextSibling = oldChild.NextSibling;
this.RemoveChild(oldChild);
this.InsertBefore(newChild, nextSibling);
return oldChild;

Het is dus InsertBefore die waarschijnlijk de error gooit.

Controleer hetvolgende eens
C#:
1
2
sourceRolesNode.OwnerDocument == targetRolesNode.OwnerDocument && 
targetRolesNode.NextSibling.OwnerDocument == targetRolesNode.OwnerDocument


Voor engelse exceptions kan je volgens mij gewoon het .net language pack deinstalleren.

[ Voor 19% gewijzigd door Woy op 06-05-2009 11:51 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:52
Haan schreef op woensdag 06 mei 2009 @ 11:43:
Weet je het heel zeker? In ieder geval doe je in regel 5 en 6 precies andersom wat je in regel 4 doet, dus iets klopt daar niet..
Typ ik in al mijn blindheid "Nee", maar dit moet natuurlijk zijn "Ja" :o.

Inderdaad, dit is de oplossing. In al mijn blindheid heb ik hier overheen gekeken en ik moet ook zeggen dat ik het enigszins onlogisch vind. In mijn optiek zou je altijd eerst de oude meegeven als parameter en pas daarna de nieuwe, maar blijkbaar werkt dat hier dus andersom.

Verschrikkelijk stomme fout dit natuurlijk dus laat ik er maar snel over ophouden :X.

Bedankt :).
Pagina: 1