First: To work with XML::LibXML::Reader, your XML document has to be valid. Your example has a bad entity (as has been already pointed out by LanX), also the named entities are not declared.
Without any attempt to make it pretty, here's a hack with your (corrected) example text. It shows a minimal context around each parenthesis found and indents according to level.
use 5.032;
use warnings;
use XML::LibXML::Reader qw( :types );
use open ':std', OUT => ':encoding(UTF-8)';
my $data = \*DATA;
my $reader = XML::LibXML::Reader->new( IO => $data );
my $paren_level = 0;
while ($reader->read) {
next unless $reader->nodeType == XML_READER_TYPE_TEXT;
my $text = $reader->value;
while ($text =~ /([^() ]*\s*)([()])(\s*[^() ]*)/g) {
if ($2 eq '(') {
say " " x ($paren_level++ * 4),
"opening: '$&'";
}
else {
if ($paren_level < 1) {
say "non-matching: '$&'";
}
else {
say " " x (--$paren_level * 4),
"closing: '$&'";
}
}
}
}
if ($paren_level) {
say "At the end, $paren_level parentheses were left unclosed.";
}
__DATA__
<?xml version="1.0"?>
<!DOCTYPE rn [
<!ENTITY auml "ä">
<!ENTITY Auml "Ä">
<!ENTITY ouml "ö">
<!ENTITY Ouml "Ö">
<!ENTITY uuml "ü">
<!ENTITY Uuml "Ü">
<!ENTITY sect "§">
<!ENTITY emsp14 " ">
<!ENTITY ldquor "„">
<!ENTITY rdquor "”">
]>
<rn>
<rnnum>52</rnnum>
<p>In Anlehnung an den Ansatz von Tokio 2013 <emph>definiert</emph> &s
+ect; 1 II XXX die nachhaltige Bewirtschaftung als eine
+Bewirtschaftung, die die sozialen und wirtschaftlichen Ansprüche
+ an den Boden mit seinen ökologischen Funktionen in Einklang bri
+ngt. Es soll eine gleichberechtigte Berücksichtigung von ökologi
+schen, ökonomischen und sozialen Aspekten („Bedarfstripel
+”<fn id="xxx">
<p>Mayer, JJV 2022, 28, 29.</p>
</fn>) für die Nutzung angestrebt werden. Ziel ist ein Ausgleich
+der drei „Säulen”, die prinzipiell gleichwertig si
+nd. <fn id="yyy">
<p>Reiter, in: BoGB, Öffentliche Regeln, § 4 Rn.&emsp
+14;6 f.; Mayer, NatBl. 1996, 1082, 1083.</p>
</fn> Dabei muss allerdings der Grundgedanke der Stärkung der &ou
+ml;kologischen Funktionen im Sinne der Ressourcenschonung berück
+sichtigt werden. Die ökologischen Funktionen müssen mit den
+ wirtschaftlichen und sozialen Interessen in Einklang gebracht werden
+.<fn id="zzz">
<p>So auch in seiner Einleitung der Beschluss der 72. ROK vom 27.&emsp
+14;06. 2017, der in („Leitbilder und Handlungsstrategien f&uum
+l;r die Bodennutzung (in ländlichen Gebieten)”) sehr gut
+die aktuellen Herausforderungen beschreibt, die unterschiedlichen Asp
+ekte nach dem Topziel der Nachhaltigkeit strukturiert und sie mit bei
+spielhaften Handlungsansätzen versieht.</p>
</fn> Wenn die Ökologie von vornherein gegenüber den wirtsch
+aftlichen und sozialen Ansprüchen zurücktritt, verliert die
+ Nachhaltigkeit ihre Orientierungsfunktion, und die Begrifflichkeit w
+ird ad absurdum geführt.</p>
</rn>
This example has no non-matching parentheses, the output reads:
opening: 'Aspekten („Bedarfstripel”'
closing: ') für'
opening: 'in („Leitbilder'
opening: 'Bodennutzung (in'
closing: 'Gebieten)”'
closing: ') sehr'
|