Bitte bitte bitte. Don't use regular expressions to parse XML.
Es sind schlechte Nachrichten. Es ist spröde und hacky, und am wichtigsten von allem - völlig unnötig.
Reguläre Ausdrücke behandeln keinen Kontext. Und bei XML dreht sich alles um den Kontext.
XML
hat bereits eine Abfragesprache namens xpath
, die viel besser geeignet ist.
Hier ist ein Beispiel für finden einen Knoten mit xpath
.
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> new -> parsefile ('yourfile.xml');
print $twig -> get_xpath('//consumer', 0) -> att('attribute'),"\n";
Aber wenn man sie verändern und löschen möchten attribute
:
$_ -> del_att('attribute') for $twig -> get_xpath('//consumer[@attribute]');
$twig -> set_pretty_print('indented_a');
$twig -> print;
ich aber fragen würde - warum versuchen Sie, das zu tun? Es klingt wie ein weiterer kaputter Prozess irgendwo - vielleicht versucht ein anderes Skript, das XML zu regex
?
Aber die andere Sache, die XML::Twig
nicht wirklich gut ist es twig_handlers
hat, die Sie XML mehr behandeln lassen ordentlich Ströme (zB ohne sie alle in den Speicher zu analysieren, um
Das ist ein bisschen wie das geht.
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
sub delete_unwanted {
my ($twig, $element) = @_;
$element -> del_att('attribute');
#dump progress so far 'out'.
$twig -> flush;
#free memory already processed.
$twig -> purge;
}
my $twig = XML::Twig -> new (twig_handlers => { '//consumer[@attribute]' => \&delete_unwanted });
$twig -> parsefile ('your_xml.xml');
Wir setzen einen Handler, so dass jedes Mal, wenn der Parser eine consumer
mit einem attribute
Attribut trifft. (Bad Name, der) es löscht sie, flush
es (prints) der analysierten XML und spült es aus dem Speicher. Dies macht es sehr speicher effizient, da Sie nicht das ganze Ding in den Speicher lesen, und kann so ziemlich inline regexing Typ Operationen.
'$ str = ~ s/] * attribute =" ([^ \ "] *)" [^>] *>//g; 'Hier kann das Attribut gemischt werden oder mehr als ein Attribut ist möglich Daher verwenden wir '[^>] *'. –
ssr1012
Klingt verdächtig, als würden Sie 'XML' mit regulären Ausdrücken analysieren. Wenn ja: Es ist eine schlechte Idee, stattdessen 'XML :: Twig' zu verwenden. (Post einige XML und gewünschte Ausgabe, und ich werde Ihnen ein Beispiel, wie es richtig zu tun) – Sobrique
@ ssr1012 - Not working :( –