Toon posts:

XML InnerText wist childnodes?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers,

Ik heb op het moment een uitdaging met System.Xml.XmlDocument. Ik laad daar bijvoorbeeld de volgende XML in:

code:
1
2
3
4
5
6
7
<xml>
  <elementA attribuut1="waarde" attribuut2="waarde">
     <Childnode1>0</Childnode1>
     <Childnode2>1</Childnode2>
     <Childnode3>2</Childnode3>
  </elementA>
</xml>


Vervolgens doe ik een doc.DocumentElement.SelectSingleNode("//elementA").

De XmlNode die ik dan krijg is ook de <elementA>, deze heeft 3 childnodes. Helemaal mooi. Nu moet ik daar de waarde van instellen op bijvoorbeeld "Joepie", dus ik doe myNode.InnerText = "Joepie"; Het resultaat is dan als volgt:

code:
1
2
3
<xml>
  <elementA attribuut1="waarde" attribuut2="waarde">Joepie</elementA>
</xml>


Dus op de een of andere in mijn ogen nog belachelijke manier zet hij de waarde wel, maar zijn alle childnodes meteen verdwenen.

Als je, voordat je de InnerText zet kijkt wat de waarde is van InnerText op de rootnode elementA, dan blijkt dit (in dit voorbeeld) ook 012 te zijn, dus alle waarden van de childnodes bij elkaar.

Het is dus duidelijk dat hij de childnodes overschrijft, terwijl ik toch de InnerText zet en niet de InnerXml. Ik heb geprobeerd de Value property te gebruiken maar die is helaas read-only.

Als ik ga googlen dan zie ik dingen als "XmlNode.InnerText is doing exactly what it is supposed to do, it "Gets or sets the concatenated values of the node and all its child nodes. ", maar ik kan nog nergens een site vinden die aangeeft hoe je dus de value van alleen dat specifieke element kan zetten op een XmlNode object (zodat je dus niet alle childnodes kwijt raakt).

Iemand enig idee?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:19

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 18 november 2008 @ 11:45:

Dus op de een of andere in mijn ogen nog belachelijke manier zet hij de waarde wel, maar zijn alle childnodes meteen verdwenen.
Op mij komt het juist compleet logisch over dat je, wanneer je de inhoud zet, de vorige waarde overschrijft. Wat had hij anders moeten doen? Het ervoor zetten? Het erna zetten?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik vind het ook compleet logisch, maar wat je eens zou kunnen proberen (even op de gok) is een textnode toevoegen ofzo met appendchild; dan kun je ook specificeren waar als het goed is. Sowieso wil je geen text én nodes binnen hetzelfde element imho.

[ Voor 11% gewijzigd door RobIII op 18-11-2008 12:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom ga je niet direct naar de node toe die je wilt wijzigen? Je blijft nu een niveau erboven hangen zover ik je begrijp. Ik ben het dan ook eens met Janoz dat me dit correct gedrag lijkt.

Acties:
  • 0 Henk 'm!

  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 19-05 10:05
Voor zover ik het begrijp wil je een childnode wijzigen binnen elementA. Of je wilt een childnode toevoegen met een waarde. Maar het geen je op dit moment doet is de innertext van elementA aanpassen. En dat is in je voorbeeld 3 childnodes en die wijzig je in het woord Joepie.

Dit is volstrekt juist wat er gebeurd.

Het is alleen voor mij neit duidelijk wat je precies wilt bereiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de snelle reacties!

Ik wil juist geen childnode waardes wijzigen, ik wil de waarde van de rootnode wijzigen. Hij moet de childnodes dus ongemoeid laten. Het gewenste resultaat is dus:
code:
1
2
3
4
5
6
7
<xml>
  <elementA attribuut1="waarde" attribuut2="waarde">Joepie
     <Childnode1>0</Childnode1>
     <Childnode2>1</Childnode2>
     <Childnode3>2</Childnode3>
  </elementA>
</xml>


@Janoz: Ik overschrijf de value van het element, het is niet mijn intentie om de childnodes te overschrijven.

@RobIII: Tekst en nodes in hetzelfde element moet volgens mij prima kunnen. Het wordt gebruikt in een standaard die wij moeten hanteren dus ik heb ook niet de keuze het maar niet te doen. Ik wil ook geen childnode met een waarde toevoegen, maar een waarde zetten op het hoofd element.

@Cartman: Ik zit op de node waarvan ik de waarde wil wijzigen, ik wil alleen niet dat de childnodes worden gewist.

@The_Ghost16: Nee, ik wil geen childnode wijzigen, ik wil de waarde van de rootnode aanpassen zonder de childnodes te wijzigen.

InnerText blijkbaar de verkeerde property om te wijzigen, maar er is niet een soort van SetNodeValue om alleen de nodewaarde van de rootnode aan te passen zonder de childnodes om zeep te helpen.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit levert een beetje een gek XML-document op (weet je zeker dat je dit wilt?). Meestal heb je of child-attributen, of een waarde (HTML is een tegenvoorbeeld). Het kan natuurlijk wel, ik dacht met PrependChild in combinatie met CreateTextNode.

[ Voor 11% gewijzigd door pedorus op 18-11-2008 12:55 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer eens het volgende:

//elementA/text()

Hiermee wordt de text van het huidige element geselecteerd.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:19

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 18 november 2008 @ 12:42:
@Janoz: Ik overschrijf de value van het element, het is niet mijn intentie om de childnodes te overschrijven.
De childnodes zijn de value van het element.
@RobIII: Tekst en nodes in hetzelfde element moet volgens mij prima kunnen. Het wordt gebruikt in een standaard die wij moeten hanteren dus ik heb ook niet de keuze het maar niet te doen. Ik wil ook geen childnode met een waarde toevoegen, maar een waarde zetten op het hoofd element.
Een tekst is zelf niks meer dan een childnode die enkel uit tekst bestaat.
@Cartman: Ik zit op de node waarvan ik de waarde wil wijzigen, ik wil alleen niet dat de childnodes worden gewist.
Nogmaals de waarde van de node bestaat uit zijn childnodes
@The_Ghost16: Nee, ik wil geen childnode wijzigen, ik wil de waarde van de rootnode aanpassen zonder de childnodes te wijzigen.

InnerText blijkbaar de verkeerde property om te wijzigen, maar er is niet een soort van SetNodeValue om alleen de nodewaarde van de rootnode aan te passen zonder de childnodes om zeep te helpen.
Ik hoop dat zo langzamerhand de kronkel in je gedachte duidelijk wordt. De inhoud van een node is niet opgedeeld in een textdeel en een childnodes deel. De inhoud is de text en de childnodes.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 14:01

NetForce1

(inspiratie == 0) -> true

Janoz schreef op dinsdag 18 november 2008 @ 13:02:
[...]
Ik hoop dat zo langzamerhand de kronkel in je gedachte duidelijk wordt. De inhoud van een node is niet opgedeeld in een textdeel en een childnodes deel. De inhoud is de text en de childnodes.
Misschien handig om de oplossing er dan ook bij te vermelden. Je moet dus, zoals Pedorus aangeeft, een textnode maken en die als childnode toevoegen aan je node. Aan die textnode kun je dan weer je tekst toevoegen.

[ Voor 4% gewijzigd door NetForce1 op 18-11-2008 13:05 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 15:57

Haan

dotnetter

Volgens mij kan je ook nog dit gebruiken:
C#:
1
myNode.Attributes.Append(nieuw attribuut)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okee..., het wordt zo langzamerhand duidelijk. Al was een "TextValue" property in dit geval dan geen overbodige luxe geweest. Ik ga eens kijken of ik dit voor elkaar kan krijgen. Bedankt!

@Haan, dat lukt helaas, niet, dan krijg ik een attribuut erbij wat weer niet is toegestaan volgens de schema definitie.

[ Voor 24% gewijzigd door Verwijderd op 18-11-2008 13:09 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 18 november 2008 @ 12:42:
@RobIII: Tekst en nodes in hetzelfde element moet volgens mij prima kunnen. Het wordt gebruikt in een standaard die wij moeten hanteren dus ik heb ook niet de keuze het maar niet te doen. Ik wil ook geen childnode met een waarde toevoegen, maar een waarde zetten op het hoofd element.
Je wil dus wél een childnode toevoegen, van het type 'textnode' o.i.d.; wat ik dus zei (en bevestigd wordt door pedorus)
RobIII schreef op dinsdag 18 november 2008 @ 12:03:
maar wat je eens zou kunnen proberen (even op de gok) is een textnode toevoegen ofzo met appendchild

[ Voor 5% gewijzigd door RobIII op 18-11-2008 13:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:19

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 18 november 2008 @ 13:08:
Okee..., het wordt zo langzamerhand duidelijk. Al was een "TextValue" property in dit geval dan geen overbodige luxe geweest. Ik ga eens kijken of ik dit voor elkaar kan krijgen. Bedankt!
Wat zou TextValue dan terug moeten geven volgens jou?

En wat zou hij terug moeten geven bij het volgende?

<node>Beetje tekst <b>met bold</b> en nog wat tekst <img />.</node>


@NetForce1: Ik ben niet bekend met de .NET api dus weet neit de letterlijke oplossing. Ik kan me dus alleen richten op het duidelijk proberen te maken van de denkfout.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt allemaal, ik heb nu een methode die eerst kijkt of er al XmlText elementen bestaan, dan past hij daarvan de InnerText aan naar mijn te zetten waarde. Bestaan ze niet dan voeg ik een XmlText toe als childnode. Dit werkt inderdaad prima. Ik moet nu alleen al mijn aanroepen naar .InnerText = aanpassen om deze methode te gebruiken... en ik blijf het een beetje jammer vinden dat het XmlElement object deze methode niet al had.

@Janoz, leuk voorbeeld... Ik had het leuk gevonden als hij "Beetje tekst en nog wat tekst" had weergegeven en de bold en img tags als childnodes had gezien.

[ Voor 17% gewijzigd door Verwijderd op 18-11-2008 13:51 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:19

Janoz

Moderator Devschuur®

!litemod

Nogmaals. Probeer je eens een implementatie voor te stellen. Je zegt dat het leuk zou zijn wanneer "Beetje tekst en nog wat tekst" terug zou krijgen, maar wat nu als je die tekst aan zou passen? Waar zouden de childnodes terecht moeten komen?

Het feit is dat het stukje dat ik poste eigenlijk een element met 4 childnodes is. Eerst een text-node, dan een bold-node, dan een tekst-node en tot slot een img-node.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Janoz schreef op dinsdag 18 november 2008 @ 14:13:
Het feit is dat het stukje dat ik poste eigenlijk een element met 4 childnodes is. Eerst een text-node, dan een bold-node, dan een tekst-node en tot slot een img-node.
Zelfs 5, de punt. ;) Maar ik ben het volledig met je eens dat TS XML aan het misbruiken is, of XML niet snapt.

Eigenlijk is de enige zinnige reden om zowel tekst als childnodes te hebben voor opmaak van de tekst. Daarom retourneert .InnerText ook de tekst van de childnodes, zodat je geen gekke situaties krijgt als je zonder opmaak werkt. Ik ken ook geen (zinnige) XML-implementatie die een soort .TextNodesText heeft, want daar krijg je alleen maar misbruik van (waar TS nu volgens mij mee bezig is). :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
:)..., ik heb de Hr-XML standaard verder ook niet bedacht hoor. Ik had alleen altijd het idee dat een element tekst kon bevatten, en child elementen. Nu weet ik dat je dus ook meerdere tekst elementen kan hebben. Het voorbeeld van HTML code in xml maakt dat ook weer mooi duidelijk. Het echte voorbeeld waar het om gaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
  <Allowance type="daily" billable="true">
  <Id>
  <!--  The expense/allowance types are specified in the attribute 'name' and have been standardized in The Netherlands 
  --> 
  <IdValue name="allowance" /> 
  </Id>
  <StartDate>2007-08-27T00:00:00</StartDate> 
  <EndDate>2007-08-27T00:00:00</EndDate> 
  <Amount currency="EUR">9</Amount> 
  <Comment /> 
  meal 
  </Allowance>


Hier is meal dus de tekst van allowance... en ja..., de childnodes dus ook. In dit geval was het dus leuk geweest als je een makkelijke methode had om alleen de tekst "meal" aan te passen. Ik ben het er helemaal mee eens dat dit beter als attribuut of extra childnode was geweest maar nogmaals, ik heb het niet bedacht.

[ Voor 14% gewijzigd door Verwijderd op 18-11-2008 14:49 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 18 november 2008 @ 13:47:
@Janoz, leuk voorbeeld... Ik had het leuk gevonden als hij "Beetje tekst en nog wat tekst" had weergegeven en de bold en img tags als childnodes had gezien.
Ok, stel er is een property die idd "Beetje tekst en nog wat tekst." teruggeeft. Wat dan als je die property aanpast naar "The quick brown fox jumps over the lazy dog.", hoe komt de XML er dan uit te zien?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op dinsdag 18 november 2008 @ 14:45:
:)..., ik heb de Hr-XML standaard verder ook niet bedacht hoor.
Ik heb het ook niet bedacht, maar als ik er even op zoek, dan vind ik dit soort gekke dingen echt niet hoor ;) Het lijkt erop alsof meal het type had moeten zijn, en daily gewoon weg kan... :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@pedorus, dit is dan net weer een iets aangepaste HR-XML, namelijk de SETU HRXML (www.setu.nl).

@.oisyn, Wat mij betreft had die dan weer 1 textnode gemaakt met the quick brown fox jumps over the lazy dog (tenminste..., dat was voor mij in dit geval een positieve oplossing geweest). Ik geef alleen toe dat dit ook weer tot problemen kan leiden.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 13:00

Patriot

Fulltime #whatpulsert

Maar waar gaan de childnodes dan heen? Want dat is .oisyn's vraag (en ook die van Janoz).

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik denk dat we er wel uit zijn dat het niet gaat werken, Mammaplank heeft dat inmiddels imho ook aangegeven:
Verwijderd schreef op dinsdag 18 november 2008 @ 15:23:
Ik geef alleen toe dat dit ook weer tot problemen kan leiden.
...en ik denk dat we daarmee nu lang genoeg gezaagd hebben over een denkfoutje.

Overigens, om te jennen misschien, maar je zou een FooText() kunnen maken die eerst alle texnodes sprokkelt, die aan elkaar plakt en bij het setten ervan gewoon de oude texnodes kunnen wegmikken en de nieuwe value als een enkele textnode aanmaken en weer terughangen "ergens" in de parent, be it vooraan, achteraan of ergens willekeurig middenin. Dat het de structuur van je document om zeep helpt in meer of mindere mate, true. Then again had het in the first place al niet mixed (text/nodes) moeten zijn.

[ Voor 41% gewijzigd door RobIII op 18-11-2008 15:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1