Toon posts:

[VB.NET/XPath] XPath argumenten probleem*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met een programma te schrijven in VB .NET, maar ik heb een probleem met het uitlezen van de nodes met behulp van een XPath.

De situatie zit als volgt:

De structuur van de XML file:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- <root creator="MrWhite">
- <datasets>
- <dataset>
  <DataField name="DATE">6/01/2004</DataField> 
  <DataField name="DF1">43</DataField> 
  <DataField name="DF2">Test, Test</DataField> 
  </dataset>
- <dataset>
  <DataField name="DATE">6/01/2004</DataField> 
  <DataField name="DF1">44</DataField> 
  <DataField name="DF2">Test2, Test2</DataField> 
    </dataset>
  </datasets>
  </root>


Voor het ophalen van een bepaalde node gebruik ik nu een XPathQuery van de vorm:
code:
1
2
szXPathQuery = "/root/datasets/dataset [./Datafield [@name = 'DF1' ] = '43' ]"
nodeToRemove = worklist.documentElement.selectSingleNode(szXPathQuery)

Maar deze nodeToRemove bevat geen node. Het werkt wél wanneer ik een XPath gebruik zonder de argumenten (maar dan dus wel met een .selectNodes, omdat er dan meerdere nodes kunnen geselecteerd worden). Dus bv:
code:
1
2
szXPathQuery = "/root/datasets/dataset [./DataField]"
nodesToRemove = worklist.documentElement.selectNodes(szXPathQuery)


Dan bevat nodesToRemove wel degelijk nodes. Dus het probleem zit ergens bij de syntax voor de variabele, alleen zie ik niet echt in wáár dan |:(

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Ik heb niet echt 'working experience' met XPath, maar wat gebeurt er als je die quotes rond 43 weglaat in je XPath Query?

https://fgheysels.github.io/


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
volgens mij moet het zo:
code:
1
2
/root/datasets/dataset[./Datafield[@name = 'DF1']/text() = '43']
                                                 ^^^^^^^

Verwijderd

Topicstarter
marcusk schreef op 06 januari 2004 @ 21:13:
volgens mij moet het zo:
code:
1
2
/root/datasets/dataset[./Datafield[@name = 'DF1']/text() = '43']
                                                 ^^^^^^^
Ook met de /text() toevoeging blijft hij geen nodes vinden....

En Whoami, die quotes zijn verplicht...

Maar toch bedankt...

[ Voor 4% gewijzigd door Verwijderd op 06-01-2004 21:28 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Moet dit niet zijn:

szXPathQuery = "//datasets/dataset/DataField[@name = 'DF1' and . = '43' ]"

?

[ Voor 61% gewijzigd door EfBe op 06-01-2004 22:35 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
EfBe, bedankt! Dit lijkt te werken!

Maar nog even een domme vraag, hoe krijg ik nu de parentnode ervan verwijderd?

code:
1
nodeToRemove.parentnode.removechild(nodeToRemove)

Verwijdert blijkbaar alleen de DF1 node, en dus niet de gehele dataset.

code:
1
2
NodeparentNode = nodeToRemove.parentNode
worklist.documentElement.removeChild(NodeparentNode)

Geeft de melding "The parameter Node is not a child of this Node" ....

  • EfBe
  • Registratie: Januari 2000
  • Niet online
als je de dataset node wilt verwijderen, dan moet je die selecteren middels XPath. Ik dacht dat je de DataField node wilde selecteren. Je moet dus een XPath query opstellen waarbij je de DataSet node selecteert op basis van een setje values van de DataField, iets in de trant van:

szXPathQuery = "//datasets/dataset[./DataField @name = 'DF1' and . = '43' ]"

In visual studio.net, open de help index en tik in 'XPath'. Daaronder vindt je 'Examples', die komen uit de MSXML sdk maar je hebt wel een hele waslijst van voorbeelden om dingen te selecteren. Ik denk dat je er dan wel uit komt :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Mja, was niet heel duidelijk geweest :) Het was dus inderdaad de bedoeling dat een complete dataset verwijderd werd :)

Maar nu werkt het dus, XPath ziet er als volgt uit:
code:
1
 szXPathQuery = "//datasets/dataset[./DataField [@name = 'DF1' and . = '43' ]]"


Hartelijk bedankt!

Verwijderd

Topicstarter
Even dit topic terug omhoog schoppen, aangezien het over dezelfde XML file gaat...

Heb nu even tijd om verder te werken aan dit projectje, maar zit ondertussen weer met een XPath probleem:

Het zou normaal de bedoeling moeten zijn om de node te selecteren, waarvan de elementen overeenkomen met het gezochte profiel.

Dit werkt bijvoorbeeld wél:
code:
1
2
szXPathQuery = "//datasets/dataset[./DataField[@name = 'DF1' 
and contains(., '" & txtPatientID.Text & "')]]"


Maar ik vind de syntax niet om meerdere elementen van de node te controleren.
Het meest logische lijkt mij iets in de aard van:
code:
1
2
3
szXPathQuery = "//datasets/dataset[./DataField[@name = 'DF1' 
and contains(., '" & txtPatientID.Text & "')]
AND [@name = 'DF2' and contains(., '" & txtPatientName.Text & "') ]]"

Maar deze geeft een "expression expected" error op het haakje achter de AND.

Iemand enig idee hoe de syntax dan wél in elkaar zou kunnen zitten?
Pagina: 1