[.NET] XPath voor objecten / JXPath in .NET?

Pagina: 1
Acties:

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Na regular expressions te hebben 'ontdekt' begin ik nu redelijk gecharmeerd te raken van de kracht van XPath. Vooral de compactheid van XPath-expressies spreekt me aan; toegegeven, het kost me enig nadenkwerk om een goede expressie in mekaar te zetten, maar dan heb je ook wat.

Nu vroeg ik me af of er niet iets soortgelijks bestaat voor de 'OO-wereld' (van .NET, of een algemene standaard), waarmee je d.m.v. een declaratieve expressie door een tree van objecten kan (laten) lopen en daar een aantal nodes uit selecteren op basis van criteria? Ik weet dat er voor java een aantal alternatieven zijn, waarvan JXPath (waarschijnlijk) een van de bekendere opties is, maar ik kan niets soortgelijks vinden voor .NET?

Er schijnt ooit iets als OPath in het leven geroepen te zijn, maar dat heeft voor zover ik kon bepalen te maken met ObjectSpaces, een MS-technologie die een mapping maakt tussen database-tabellen en classes (een beetje a la (N)Hibernate), en dat is niet echt wat ik zoek.

Ik weet dat er in .NET 3.0 een nieuwe querytaal bijkomt (Linq) die het mogelijk moet maken om databasetabellen als objecten te benaderen en objecten met behulp van een soort Object-SQL uitgevraagd kunnen worden, maar dat mist toch echt de elegantie van een XPath-achtige expressie. Plus dat het eigenlijk een hoop syntactic sugar is - voor zover ik weet wordt er onder water nog gewoon code gegenereerd zoals je die nu zelf moet schrijven om door collecties te lopen en velden uit te vragen...

Wie weet er meer over XPath-achtige alternatieven voor object-structuren in .NET?

Voor de duidelijkheid, ik heb het hier niet over een object-georienteerde API om XML-documenten uit te vragen met behulp van XPath, maar over een XPath-achtige query-taal waarmee een (willekeurige) tree van objecten doorzocht kan worden.

[ Voor 10% gewijzigd door MrBucket op 23-03-2006 08:35 ]


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 19:35

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Voor de duidelijkheid, ik heb het in mijn openingspost niet over een object-georienteerde API om XML-documenten uit te vragen met behulp van XPath, maar over een XPath-achtige query-taal waarmee een (willekeurige) tree van objecten doorzocht kan worden.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik denk dat dit niet zo moeilijk kan zijn dmv een recursieve functie en reflection in combinatie met een goed gekozen query-path syntax.

wanneer je goeie OO hebt kan een class toch enkel properties en methods naar buiten brengen.

code:
1
startobject.property.method(parameter).property


startobject en property zijn peanuts.
bij de method moet je de parameters converteren naar het juiste type en van daaruit is de rest ook pea-nuts.

of stel ik het hier te simpel voor en heb je veel meer in gedachten ?

ASSUME makes an ASS out of U and ME


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 21-02 17:46

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
misschien iets als db4o ?

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Aangezien de analogie met XPath niet voor iedereen even duidelijk is, zal ik proberen een voorbeeldje te geven van wat ik wil.

Stel, Ik heb de classes Bedrijf, Afdeling en Medewerker:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Bedrijf{
  public string Naam;
  public ICollection Afdelingen;
}

public class Afdeling{
  public string Naam;
  public ICollection Medewerkers;
}

public class Medewerker{
  public string Naam;
  public string Woonplaats;
}
Stel dat ik nu zo'n Bedrijf object heb dat gevuld is met Afdelingen die elk weer een aantal Medewerkers hebben. Dan zou ik middels een XPath-achtige expressie als
C#:
1
2
ICollection amsterdammers = ObjectPath.Select(
    mijnBedrijf, "/Afdelingen/Medewerkers[Woonplaats.Equals(\"Amsterdam\")]");
alle Medewerkers uit Amsterdam willen opvragen.

Nu kan ik zelf wel een parser schrijven voor mijn eigen bedachte syntax, die middels reflection de gevraagde data retourneert, maar ik zou graag weten of hier ook een standaard voor bestaat, zodat ik niet zelf zo'n taaltje hoef te bedenken.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Een standaard weet ik niet, ik heb wel ooit een Iterator gemaakt waarmee je de standaard XPath iteraties kan gebruiken in een tree (Self, Child, Descendant, FollowingSibling, etc). Ik heb het hier online gezet. Niet het antwoord op je vraag, maar misschien wel.leuk om te bekijken

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
Je kan je eigen ObjectXPathNavigator bouwen :) lees hier meer
dan kan je je business objecten met xslt bewerken :P

ook zou je een navigator kunnen maken die in de database kijkt ...

ik heb het wel eens ooit gemaakt .. maar de performance is wel iets waar je alert op moet zijn ...

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Orphix, bedankt voor je code-fragmentje :) Het is inderdaad niet echt wat ik zoek, maar het heeft me wel geholpen om iets anders duidelijk te krijgen, namelijk dat het wel degelijk mogelijk is om (bijna) alle XPath axes te definieren voor een tree (graaf) van objecten. Daar zat ik eerst nog een beetje over in dubio, maar een code-voorbeeld kan in zo'n geval wel helpen.
Ik merk trouwens wel dat mijn template-kennis (generics in .NET-termen) behoorlijk is weggezakt nu ik niet meer in C++ programmeer. Toch wel elegant hoor...

Joopst, die link is super... van wat ik tot nu toe ben tegengekomen zal dit het dichtste bij liggen bij wat ik voor elkaar wil zien te krijgen. 't Is sowiezo een originele aanpak om een adapter te schrijven voor een XPathNavigator zodat 'ie op een graaf van objecten kan werken, en het scheelt je weer zelf een XPath-parser schrijven.

Waar ik wel tegenaan denk te lopen, is dat de XPath-syntax niet 'rijk' genoeg is om een aantal van de eigenschappen uit te vragen die specifiek zijn voor een objectmodel. Bijvoorbeeld de mogelijkheid om predicaten op basis van het object-type op te stellen ('selecteer alle children die strings zijn'), en om het onderscheid te kunnen maken tussen members van een collectie en elementen van een collectie. Bijvoorbeeld: de expressie '/Afdeling/Medewerker' zou alle children (Medewerkers) van een Afdeling moeten opleveren, maar bij de expressie '/Afdeling/Count' zou je de property van het Afdeling-object zelf verwachten... hoe maak je hier onderscheid in?
Nu is mijn XPath kennis niet zo heel scherp, dus misschien dat er inderdaad wel een mogelijkheid voor bestaat hoor, maar ik zou 'm zo niet weten.

JXPath biedt wel antwoorden voor een aantal van deze vragen, maar ook alleen maar in zoverre als Java overeenkomsten heeft met .NET. Aan zaken als attributes en operator overloading wordt bijvoorbeeld geen aandacht besteed omdat die niet op Java van toepassing zijn.

Al met al toch nog best wel een complex vraagstuk denk ik (maar wel interessant) :)
Pagina: 1