Toon posts:

XMLStarlet selecteer attribuut met de meeste elementen

Pagina: 1
Acties:

Vraag


  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 15:28

Yagermeister

Bedrijfsprutser on call

Topicstarter
Mijn vraag

Ik heb een vraag met betrekking tot een XML file die ik via een API ophaal. In deze xml zit een stuk genaamd "ParentCategoryPaths" welke bestaat uit een aantal "ParentCategoryPaths". Hiervan moet ik de "ParentCategories" van selecteren welke de meeste elementen erin heeft staan. In onderstaand voorbeeld is dat dan diegene met "Waterkokers" erin (de voorlaatste).

Op dit moment gebruik ik:
xmlstarlet sel --net -t -m '/SearchResults/Products/ParentCategoryPaths/ParentCategories' -n -v "concat(id, ';', name, /n)"
echter geeft deze dus alles terug en als ik [last()] toevoeg krijg ik alsnog de verkeerde. Omdat dit mogelijk nooit op dezelfde plek zit of een zelfde aantal heb zou ik graag iets hebben wat robuuster werkt dan het gokken wat ik nu steeds doe.

Heeft iemand een idee hoe ik alleen de "ParentCategoryPaths" kan aanhouden met daarin de meeste "ParentCategories". Om het eventueel heel specifiek te maken zou de laatste "ParentCategories" van dat betreffende path ook al goed (nog beter zelfs) zijn.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<SearchResults>
<OriginalRequest/>
<TotalResultSize>1</TotalResultSize>
<Products>
<Id>9200000010322377</Id>
<EAN>8004399771970</EAN>
<GPC>KIT</GPC>
<Title>
</Title>
<SpecsTag>De'Longhi</SpecsTag>
<Summary>Grote waterkoker | Kan van: Aluminium</Summary>
<Rating>42</Rating>
<ParentCategoryPaths>
  <ParentCategories>
    <id>3136</id>
    <name>Elektronica</name>
  </ParentCategories>
  <ParentCategories>
    <id>10768</id>
    <name>Keukenapparaten</name>
  </ParentCategories>
</ParentCategoryPaths>
<ParentCategoryPaths>
  <ParentCategories>
    <id>3136</id> 
    <name>Elektronica</name>
  </ParentCategories>
  <ParentCategories>
    <id>10768</id>
    <name>Keukenapparaten</name>
  </ParentCategories>
  <ParentCategories>
    <id>10803</id>
    <name>Waterkokers</name>
  </ParentCategories>
</ParentCategoryPaths>
<ParentCategoryPaths>
  <ParentCategories>
    <id>3136</id>
    <name>Elektronica</name>
  </ParentCategories>
</ParentCategoryPaths>
</Products>
</SearchResults>

-Te huur

Alle reacties


  • aawe mwan
  • Registratie: December 2002
  • Laatst online: 11:53

aawe mwan

Wat ook leuk is:

Klopt het dat de data van de ParentCategoryPaths altijd overlappend is?

Dan zou je kunnen tellen (count functie) hoeveel ParentCategoryPaths elementen er zijn en vervolgens de ParentCategories nemen die dat nummer kind is van z'n ouder.

Dan neem ik aan dat als je 3 elementen ParentCategoryPaths hebt, dat er dan één is met 1 ParentCategories kind, 1 met 2 kinderen en 1 met 3 kinderen en het kind dat je zoekt is dat 3e kind.

[Voor 3% gewijzigd door aawe mwan op 26-01-2022 21:25]

老厮是麂


  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 15:28

Yagermeister

Bedrijfsprutser on call

Topicstarter
aawe mwan schreef op woensdag 26 januari 2022 @ 21:23:
Klopt het dat de data van de ParentCategoryPaths altijd overlappend is?

Dan zou je kunnen tellen (count functie) hoeveel ParentCategoryPaths elementen er zijn en vervolgens de ParentCategories nemen die dat nummer kind is van z'n ouder.

Dan neem ik aan dat als je 3 elementen ParentCategoryPaths hebt, dat er dan één is met 1 ParentCategories kind, 1 met 2 kinderen en 1 met 3 kinderen en het kind dat je zoekt is dat 3e kind.
Alle files die ik nagekeken heb zijn inderdaad overlappend (was voorheen niet zo).

De aanname die je doet klopt inderdaad en dat is ook wat ik nodig heb echter weet ik niet precies hoe ik daar moet komen. Ik ken de count functie in xmlstarlet maar ik weet niet hoe ik die hierop moet toepassen.


[Toevoeging]
Ik heb zojuist nog zitten te lezen in de wiki (Wikipedia: XMLStarlet) en daar kwam ik een stukje tegen welke kijkt naar de positie waarin het element zich bevindt (Example 5). Deze heb ik even gedaan middels onderstaande link en hier krijg ik ook echt waterkokers mee terug wat ook klopt. Het enigste wat nu nog een probleem is, is dat als er nog een niveau onder is, dit is geen super probleem maar als iemand daar nog een tip voor heeft zonder houtje touwtje sprongen te maken zou ik zeer dankbaar zijn.


xmlstarlet sel --net -t -m '/SearchResults/Products/ParentCategoryPaths/ParentCategories[position() >= 3]' -n -v "concat(id, ';', name, /n)"

[Voor 29% gewijzigd door Yagermeister op 27-01-2022 11:06]

-Te huur



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee