in reply to language selection via libxml

Hi,

$result=$tree->findnodes("/language/$language/widget[@ID="$id"]");

The @ID is interpreted by Perl as an array access. You have to escape the '@'.

Best regards
McA

Replies are listed 'Best First'.
Re^2: language selection via libxml
by tangent (Parson) on Jan 20, 2014 at 12:18 UTC
    Also need to lose the quotes around $id
    "/language/$language/widget[\@ID=$id]"
    Update:
    Thanks to choroba's explanations and examples below, this only works by accident, i.e. only if $id is a number.

    Here are some different ways of doing it:

    "/language/$language/widget[\@ID='$id']" "/language/$language/widget[attribute::ID='$id']" qq|/language/$language/widget[\@ID="$id"]| qq|/language/$language/widget[\@ID='$id']| qq|/language/$language/widget[attribute::ID="$id"]| qq|/language/$language/widget[attribute::ID='$id']|
      Not really. String literals must be enclosed in quotes in XPath expressions, and XPath does not know Perl variables (unless you use XML::XSH2).
      لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
        With the quotes I get
        Scalar found where operator expected near ""/language/$language/widget +[\@ID="$id" String found where operator expected near "$id"]"" syntax error near ""/language/$language/widget[\@ID="$id"
        Update: Perhaps I should have said "lose double quotes around $id", though no quotes works for me too:
        "/language/$language/widget[\@ID="$id"]" - Error "/language/$language/widget[\@ID='$id']" - OK "/language/$language/widget[\@ID=$id]" - OK