Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 30.03.11 09:31 
Hi,

Ich muß in einer XML Datei in allen attributen das "<" durch ein "&lt;" ersetzen.
Wir sind von einem alten XML Parser auf einen neuen umgestiegen der damit nicht klarkommt leider..

Mein erster ansatz war einfach zeichen für zeichen den string zu durchsuchen und jedes "<" welches zwischen zwei anführungszeichen steht zu ersetzen. Das funktioniert und ist auch nicht so schwer. Es gibt nur zu beachten das ein anführungszeichen auch mit \ escaped sein kann, und sollte dies der fall sein darf es nur ein backslash sein, keine zwei.

Also als beispiel:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
<xml>
  <tag attr="this <is> an example" />
  <tag attr="an other \"<example>\"" />
  <tag attr="something \\<strange>\\">Here is a quote " just for fun</tag>
  <tag attr="
last <one> <two> <three>" />
</xml>


Um das ganze etwas zu vereinfachten dachte ich, evtl kann man das auch mit einem regulären ausdruck lösen?
Bin leider nicht sehr bewandert damit, daher dachte ich frage ich mal hier nach ob das geht.. und wenn ja, wie ungefähr :)

Danke~
Aya

PS: Das sollte bei dem beispiel oben rauskommen:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
<xml>
  <tag attr="this <is> an example" />
  <tag attr="an other \"<example>\"" />
  <tag attr="something \\<strange>\\">Here is a quote " just for fun</tag>
  <tag attr="
last <one> <two> <three>" />
</xml>

_________________
Aya
I aim for my endless dreams and I know they will come true!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 30.03.11 10:22 
Also soweit ich XML verstanden hatte, sind \ in Strings eigentlich ja auch keine Escape-Zeichen. Von daher mache ich das generell mit Entity-Escapes, womit sich der Aufwand stark in Grenzen hält.

Als erstes musst Du die Attribut matchen, danach kannst Du wie folgt ersetzen:

ausblenden Quelltext
1:
2:
3:
4:
/\\\\|\\"|<\>/.replace(function (m) {
    static $r = array("\\\\" => "\\", "\\\"" => "\"", "<" => "<", ">" => ">");
    return $r($m[0]];
}


Zum Matchen der Attribut-Werte aus der XML-Datei kannst Du etwa Folgendes nehmen:

ausblenden Quelltext
1:
/"((?![\\"]).|\\\\|\\")*"/s.matchAll()					

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.