Dein Problem ist halt das das eingebettete XML nicht entwertet ist. Wer immer das verzapft hat, hatte von XML nicht viel Ahnung.
Zu dem Zweck gibt es den Spezialtag "CDATA"
<![CDATA[ .... ]]> Das sagt dem Parser das er alles innerhalb dieses Tags zu ignorieren ist. Man muss nur noch zusätzlich sicher gestellen, das im Entwerteten XML kein "]]>" steht. Das stellt man sicher, in dem man die drei Zeichen Aufteilt:
"]]>" => "]
]]><![CDATA[]>"
Wenn du dir sicher bist, dass im eingebetteten XML kein "</property>" vorkommt kannst du diese Holzhammer Methode verwenden:
1
2
3
4
5
6
7
8
9
10
11
12
13
my $out='';
while($xml_string=~s!^(.*?<property>\s*)(<\?xml.+?>)(\s*</property>)!!s){
$out.=$1.'<![CDATA[';
my ($in,$after)=($2,$3);
$in=~s/\Q]]>\E/]]]><![CDATA[]>/gs;
$out.=$in.']]>'.$after;
}
$xml_string=$out.$xml_string;
$out='';
das sucht nach
<property> <\?xml ... > </property> und ersetzt das durch
<property> <![CDATA[<\?xml ... >]]> </property>
Danach kannst du das XML normal parsen und "property" enthält einen String des eingebetteten XML.
Sollte
</property> vorkommen wird das ganze schwieriger, da man die XML-Verschachtelung auflösen muss. Man muss das XML partiell parsen.
Last edited: 2013-07-29 21:22:42 +0200 (CEST)