XMLStarlet selecteer attribuut met de meeste elementen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 17:04

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


Acties:
  • 0 Henk 'm!

  • aawe mwan
  • Registratie: December 2002
  • Laatst online: 21:31

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 ]

„Ik kan ook ICT, want heel moeilijk is dit niet”


Acties:
  • 0 Henk 'm!

  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 17:04

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