Das Parsen einer XML Datei mit dem Perl-XMLSimple
Ich versuche zu analysieren, eine XML
-wie-Datei mit der folgenden Struktur:
Bearbeiten:
Ich versuchte weglassen, die meisten der riesigen xml-Datei zu vereinfachen, aber alles c/p-ed-zu Unrecht. Hier die vollständige Datei (900 Kb!) tatsächlich hat dieses Problem: https://docs.google.com/file/d/0B3ustNI1qZh1UURrYWZJQk0wVlU/edit?usp=sharing
<CIM CIMVERSION="2.0" DTDVERSION="2.0">
<DECLARATION>
<DECLGROUP>
<LOCALNAMESPACEPATH>
<NAMESPACE NAME="signalingsystem"/>
</LOCALNAMESPACEPATH>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<PROPERTY NAME="Name" TYPE="string">
<VALUE>AUC$4,1,6,4,26202*-->AUC RemoteSPC: 300 SSN: 10</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>4</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<PROPERTY NAME="Name" TYPE="string">
<VALUE>AUC$4,2,6,4,26202*-->AUC AUC LocalSPC: 410 SSN: 10</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>4</VALUE>
</PROPERTY>
<VALUE>2</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
</DECLGROUP>
</DECLARATION>
</CIM>
Ich bin mit XMLSimple zu analysieren, die Struktur.
Ich brauchen, um alle Werte für die EIGENSCHAFT NAME="Name"
wenn CLASSNAME="SharedGtTranslator"
.
Dies ist, was ich versuche zu tun:
#!/usr/bin/perl
use strict;
use warnings;
# use module
use XML::Simple;
use Data::Dumper;
my $file1 = $ARGV[0];
# create object
my $xml = new XML::Simple;
# read XML file
my $data = $xml->XMLin($file1);
foreach my $object (@{$data->{DECLARATION}->{DECLGROUP}->{'VALUE.OBJECT'}}) {
if ($object->{INSTANCE}->{CLASSNAME} eq 'SharedGtTranslator') {
foreach my $property (@{$object->{INSTANCE}->{PROPERTY}}) {
if ($property->{NAME} eq 'Name') {
print $property->{VALUE} . "\n";
}
}
}
}
Immer
"Pseudo-hashes sind veraltet"
nichts passiert.
Hilfe ist sehr geschätzt!
- Im XML-Code eine fehlende EIGENSCHAFT tag. Wenn ich Feste, dass der code, den Sie geliefert funktioniert, außer für ein nicht initialisiertes Warnung.
- Eigentlich war das ein Fehler von meiner Seite. Ich versuchte weglassen, die meisten der riesigen xml-Datei zu vereinfachen, aber alles c/p-ed-zu Unrecht. Hier die vollständige Datei (900 Kb!): docs.google.com/file/d/0B3ustNI1qZh1UURrYWZJQk0wVlU/...
- Die kryptischen "Pseudo-hashes sind veraltet" - Meldung tritt auf, wenn Sie versuchen, einen index in eine arrayref, als ob es eine hashref. Ich empfehle die kurze, aber informative Perl-Referenzen-tutorial, ich Stimme auch mit @Borodin Beratung der Verwendung von XML::LibXML statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code funktioniert gut für mich, wie es steht. Ist, dass das volle Programm? Es ist keine Verwendung von pseudo-hashes in diesem code.
Das einzige problem, das ich sehen kann, ist, dass Ihre XML Daten nicht wohlgeformt ist. Es ist ein falscher
am Ende der letzten
INSTANCE
element. Sobald dies behoben wird, die Ihr Programm läuft einwandfrei.XML::Simple
scheint für Sie tätig werden, so ist es wohl angemessen, mit ihm zu haften. Aber ich don ' T in der Regel empfehlen, dass Menschen, die dieses Modul verwenden. Es kann weit von einfach, zu arbeiten, und die Struktur, es baut sich nicht vollständig widerspiegeln die XML-Daten, also sowas wieXML::Twig
oder
XML::LibXML
oft ist es viel besser.
Update
Arbeiten mit echten Daten, die Struktur, die durch
XML::Simple
sieht ganz anders als das, was generiert wird, für das kurze Beispiel. Es gibt arrays vermischt mit den hashes, die waren vorher nicht da.Dieses Programm scheint zu generieren, was Sie brauchen. Es erzeugt 170 Zeilen der Ausgabe.
Aber ich bin jetzt sicher, dass Sie wäre besser dran mit einem "echten" XML-Bibliothek. Dieser code verwendet
XML::LibXML
um die gleiche Ausgabe erzeugen.Alle Arbeit getan ist, die durch den XPath-Ausdruck selektiert alle
PROPERTY
Elemente mit einNAME
AttributName
dass sind die Kinder einerINSTANCE
element an einer beliebigen Stelle im Dokument mit einemCLASSNAME
AttributSharedGtTranslator
. Der nachfolgendefor
Schleife druckt den Wert derVALUE
element innerhalb jederPROPERTY
. Klar ist es viel übersichtlicher, und es ist auch schneller zu laufen und mehr flexibel, wenn Sie brauchen, um zu extrahieren, werden verschiedene Informationen.XML::Simple
sowie eine version mitXML::LibXML
dass ich empfehle, verwenden Sie stattdessen.Dein XML nicht wohlgeformt ist. Ich bekomme parse Fehler. Ihre allerletzte Eigenschaft, die Sie schließen, aber nicht öffnen (oder den Namen, als Ergebnis). Danach, in Perl 5.16, druckt es:
Natürlich ist das mit XML::Simple 2.20.