Page 1 of 1

How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Sun Dec 19, 2021 8:14 am
by peebee

Is it possible using XMLStarlet + an XPath specification to extract a single node from an index.plist file (like the attached)?

A single node xxxx is contained between:
<key>xxxx</key>
<dict>
................
</dict>

Thanks!
p.s. background - index.plist is the way Void Linux produces it's repo database and I want to produce a Void equivalent of /var/packages/woof-installed-packages
p.p.s XMLStarlet can be downloaded via pkgs.org - I'm using the Void download


Re: XML - XPath - XMLStarlet help needed

Posted: Sun Dec 19, 2021 1:09 pm
by Keef

Poking around in the dark here a bit, but this is what I got. Couldn't get any output at all using the examples on the link you provided, but tried something from here: https://superuser.com/questions/1026933 ... e-xml-file
(Just showing output for first package)

Code: Select all

# xmlstarlet sel -t -v '//dict/key'  index.plist
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
0ad
architecture
filename-sha256
filename-size
homepage
installed_size
license
maintainer
pkgver
run_depends
shlib-requires
short_desc
source-revisions
....

Re: XML - XPath - XMLStarlet help needed

Posted: Sun Dec 19, 2021 1:45 pm
by Keef

This may be better: :oops:

Code: Select all

# xmlstarlet sel -t -v '/plist/dict/key' -nl index.plist
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
0ad
0ad-data
2048-qt
2bwm

Re: XML - XPath - XMLStarlet help needed

Posted: Sun Dec 19, 2021 2:42 pm
by peebee

Thanks @Keef

I've managed to do what I want with some script..... e.g.

Code: Select all

#!/bin/sh
pkg=2048-qt

pkg="<key>${pkg}</key>"
begnum=`grep -n $pkg index.plist | head -1 | cut -d : -f 1`
finnum=`tail -n +"$begnum" index.plist | grep -n "	</dict>" | head -1 | cut -d : -f 1`
finnum=`expr $begnum + $finnum - 1`

sed -n "${begnum},${finnum}p" index.plist

I'll see what the speed is like - index.plist from Void is 15MB!


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 10:15 am
by jamesbond

Use xmllint which is part of libxml2, which is part of most distros.
You can use XMLStarlet if you want, the XPath is the same whichever XML tool you use (it's a standard, after all).

For example, to retrieve details about package "0ad" from index.plist, do this

Code: Select all

xmllint --xpath '/plist/dict/key[text()="0ad"]/following-sibling::dict[1]' index.plist

To get the same thing for "rox" package (the beloved rox filer):

Code: Select all

xmllint --xpath '/plist/dict/key[text()="rox"]/following-sibling::dict[1]' index.plist

To match the output of your example, it's just a matter of re-building the missing elements (of which you know all the details already).

The complete code for extract the package looks like this:

Code: Select all

#$1-package to extract, $2-path to index.plist
extract() {
	local pkg=$1 plist="$2"
	cat << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>$pkg</key>
$(xmllint --xpath '/plist/dict/key[text()="'$pkg'"]/following-sibling::dict[1]' "$plist")
</dict>
</plist>
EOF
}

_________________

Out of topic rant: (since peebee already SOLVED/CLOSED the main topic anyway):

When posting this, I want to reference my post that performs the conversion of Void's index.plist to PPM package database. And tell you what, I'm very surprised that I cannot find my own post. In fact, it seems that the whole thread about the "Let's build a Community Puppy" has completely disappeared.

This is disheartening.

I spent time to experiment and wrote that script, and then posted it. The time that I could never recover back. It was a time worthwhile spent, because, I thought, others could see and learn from it.

And now, through no fault of my own, because of other bickering personalities that has nothing to do with me or with the original post, that thread has now disappeared. I saw it when the thread was locked, and I thought it was good enough - but no, the entire thread HAS to go down the drain too.

Please, answer me: why would I bother to post anything in the future, if my posts can be taken down because others happen to pollute the thread?

Why does the thread have to go, anyway? Is it because we're ashamed that we're not a shining example of peace to the world? Is it because we're ashamed that we're not as civil as the image we try to project?

Here's a suggestion: if a thread gets too hot, by all means, LOCK IT. If you have the time and motivation to edit/remove the irrelevant posts, by all means, do that. In fact, do that right after the insults are posted, so things don't accumulate and it gets too difficult to separate the chaff from the wheat.

But please, don't take it down. Don't hide it. EVER. Leave it, for everybody to see, to learn from it.

Disagreements are part of everyday life, sometimes, even strong disagreements. We can't all agree at all time. Sometimes disagreement can be civil, sometimes it isn't. It happens even to people with the best intentions. Even to the nicest forum in the known galaxy: this forum.

To hide it is the same as not admitting that we have disagreements, pretending that we're better than what we actually are. But we know we're fooling no one. That Puppy Linux Community isn't ideal, because its members are not ideal either. We are friendly, but we should not try to show a friendly facade by sweeping the dirt under the carpet.

The same thing had happened in the old forum, and I can happily share with you that it was one of the reasons why I gradually stopped posting. Because there is really no point spending 1-2 hours writing a guide to help a newbie, when someone could just come, throw insults, and then entire thread disappears.

Merry Christmas everybody, and please, be civil.
Even if you disagree with one another.


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 10:51 am
by peebee

Hi @jamesbond

I was also disappointed that your post / attachment had disappeared - I think @bigpup must have decided to delete the whole thread - and has the ability to so do as a Moderator.

I have a copy of your script and am using it in the VoidPup32 endeavour - I have thanked you in the thread. viewtopic.php?t=4741

Thank you for your further guidance which is much appreciated.

Cheers & Seasons Greetings
PeeBee


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 2:35 pm
by one
jamesbond wrote: Mon Dec 20, 2021 10:15 am

[...]
Why does the thread have to go, anyway? Is it because we're ashamed that we're not a shining example of peace to the world? Is it because we're ashamed that we're not as civil as the image we try to project?

Here's a suggestion: if a thread gets too hot, by all means, LOCK IT. If you have the time and motivation to edit/remove the irrelevant posts, by all means, do that. In fact, do that right after the insults are posted, so things don't accumulate and it gets too difficult to separate the chaff from the wheat.

But please, don't take it down. Don't hide it. EVER. Leave it, for everybody to see, to learn from it.

Disagreements are part of everyday life, sometimes, even strong disagreements. We can't all agree at all time. Sometimes disagreement can be civil, sometimes it isn't. It happens even to people with the best intentions. Even to the nicest forum in the known galaxy: this forum.

To hide it is the same as not admitting that we have disagreements, pretending that we're better than what we actually are. But we know we're fooling no one. That Puppy Linux Community isn't ideal, because its members are not ideal either. We are friendly, but we should not try to show a friendly facade by sweeping the dirt under the carpet.
[...]
Merry Christmas everybody, and please, be civil.
Even if you disagree with one another.

Thank you @jamesbond for your wise words ...

peace


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 3:09 pm
by rockedge

I looked at the Mod Logs and yes. Theoretically I could go through hoops to retrieve it through a database backup, but it is complicated and tricky to achieve successfully. I am surprised it's gone! I thought Locked and it was good to go.

phpBB 3+ does not support a "Trash Can" feature with any restore function, deleted is deleted.


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 4:21 pm
by fredx181

Fully agree with @jamesbond and the moderator who did delete that thread should be deeply ashamed. :cry:

EDIT: Looked it up in the logs now and indeed it was @bigpup who deleted it, with reason "topic no longer needed"
Not for you to decide if a topic is needed or not, bigpup ! (even when you started it yourself)


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 5:42 pm
by williwaw

another forum I frequent has the ability for a mod to move a topic to an "admin only" review area. and restore it after edits are reviewed by the mods.

is there anything similar in phpBB 3+ ?


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Mon Dec 20, 2021 10:22 pm
by Wiz57
williwaw wrote: Mon Dec 20, 2021 5:42 pm

another forum I frequent has the ability for a mod to move a topic to an "admin only" review area. and restore it after edits are reviewed by the mods.

is there anything similar in phpBB 3+ ?

Yes, there is...and we have a forum area currently, though none of the moderators or admins have used the "move topic" to that area YET.
I looked, and as rockedge mentioned, there doesn't appear to be any way outside of tedious/time consuming searching the databases to
find those topics that were deleted.
Well, guess it's time for me to go back into "silent mode" because there are some here that think I should just be quiet and handle spam/spammers.
Wiz :lol:


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Wed Dec 22, 2021 7:44 am
by jamesbond
peebee wrote: Mon Dec 20, 2021 10:51 am

I have a copy of your script and am using it in the VoidPup32 endeavour - I have thanked you in the thread. viewtopic.php?t=4741

Thank you for your further guidance which is much appreciated.

You are very much welcome.

rockedge wrote: Mon Dec 20, 2021 3:09 pm

I looked at the Mod Logs and yes. Theoretically I could go through hoops to retrieve it through a database backup, but it is complicated and tricky to achieve successfully.
I am surprised it's gone! I thought Locked and it was good to go.

Don't bother Erik. I understand that mistakes happen, especially for new mods (oh look awesome POWERRR), but as cliche as it sounds, "with great power comes great responsibility".

I just hope that it doesn't happen again.

Wiz57 wrote: Mon Dec 20, 2021 10:22 pm

I looked, and as rockedge mentioned, there doesn't appear to be any way outside of tedious/time consuming searching the databases to
find those topics that were deleted.

Don't bother with that. I appreciate you and the other fellow mods doing the housekeeping here. It won't be the same without all your hard work.

Just remember that people also spent their time to form their thoughts and responses, typed and formatted them before posting them here. As I said, edit/remove offending posts by all means (we have house rules after all), but please be a lot more considerate before deleting an __entire__ thread (especially now we know that deletion is permanent) :shock:


Re: How to extract a single node from an index.plist using XMLStarlet + XPath? (Solved)

Posted: Thu Dec 23, 2021 7:17 am
by peebee

@rockedge @mikewalsh @Wiz57

Please lock this topic as it is both "Solved" and now Off-Topic. Thanks.