Ich gehe davon aus, dass Sie XML::LibXML
verwenden?
Es ist sehr wichtig zu erklären, welche Werkzeuge (Bibliothek, Sprache, Betriebssystem) Sie verwenden, sowie das fehlerhafte Verhalten, das Sie sehen.
Ihr "Bitte beachten Sie, dass die Variable $fileLocation
hier den Speicherort für die XML, mit der ich arbeite, öffnet" ist beunruhigend. Es macht nicht viel Sinn (es ist eine Variable und kann nichts öffnen) und der von Ihnen gewählte Bezeichner bedeutet, dass es sich um einen Pfad zur XML-Datei handelt. Aber um findnodes
darauf aufrufen zu können, muss es ein DOM-Objekt sein, genauer gesagt eine Instanz von XML::LibXML::Node
oder eine Unterklasse.
Ihr Code sollte so aussehen
use XML::LibXML;
my $xml_file = '/path/to/file.xml';
my $dom = XML::LibXML->load_xml(
location => $xml_file
);
my @sections = $dom->findnodes('//section');
for my $section (@sections) {
next unless $section->hasAttribute('name');
say $section->getAttribute('name');
}
Das Ergebnis der findnodes
Methode in Skalarkontext ist kein einziges XML::LibXML::Node
Objekt, sondern ein XML::LibXML::NodeList
, , die überlastet ist, so dass es bahaves Ähnlich wie eine Referenz auf ein Array
Sie sagen nicht, welche Fehler Sie bekommen, aber von Ihrem "Kann jemand bitte erklären, was mit diesem s falsch ist Yntax? " Ich stelle mir vor, dass das Modul Ihren XPath-Ausdruck ablehnt?
In dieser Erklärung
my $some_att = $fileLocation->findnodes("//section[/@name]")
das Problem ist mit dem Prädikat [/@name]
die, wenn es richtig wäre, würde filtern die section
Elemente nur diejenigen enthalten, die ein name
Attribut haben. Weil es ein Prädikat braucht es keine Kind Achse, und so sollte //section[@name]
geschrieben werden, aber das wird nur alle section
Elemente finden, die ein name
Attribut haben. So wählen Sie sich die Attribute müssen Sie //section/@name
, so etwas wie dieses
my $section_names = $fileLocation->findnodes('//section/@name')
schreiben Dann werden Sie ein XML::LibXML::NodeList
von XML::LibXML::Attr
Objekte haben, und Sie können die Liste ihrer Werte extrahieren etwas mit ähnlich wie
my @section_names = map { $_->value } $section_names->get_nodelist
Sie können stattdessen lieber mit einer Liste aller section
Elemente unter Verwendung des XPath-Ausdrucks //section
beginnen.Das würde Ihnen eine Sammlung von XML::LibXML::Element
Objekte, von dem Sie das name
Element extrahieren kann mit $elem->getAttribute('name')
Denken Sie daran, dass Sie mit Arrays statt XML::LibXML::NodeList
Objekten arbeiten können, wenn Sie es vorziehen, Listen-Kontext statt Skalarkontext Wahl in dem Aufruf von findnodes
wie in Mob Antwort beschrieben
Verwenden Sie 'XML :: LibXML'? – Borodin
'// section [/ @ name]' bedeutet "' section' Elemente im NULL-Namespace, die ein Root-Element mit einem Attribut namens 'name' im NULL-Namespace haben." Auf der anderen Seite bedeutet '// section [@name]' "section' Elemente im NULL-Namespace, die im Namespace ein Attribut namens' name' haben. " – ikegami