RegExp Teile in XML ersetzen

Blue_Moon

Lieutenant
Registriert
Mai 2004
Beiträge
612
Guten Morgen zusammen,
ich verzweifle gerade an einer vermutlich simplen Aufgabe.

In einer XML-Struktur gibt es die Tags <Slider name="Recommendations">, <Slider name="Referrals"> und <Slider name="Accessories">

Ich wurde in den Tags gerne die Leerzeichen, = und " " entfernen. Der restliche Text soll erhalten bleiben.
Aus <Slider name="Referrals"> sollte dann <SlidernameReferrals> und aus <Slider name="Accessories"> sollte dann <SlidernameAccessories>

Alternativ wären auch _ anstatt der Leerzeichen, = und " " denkbar.
Ich komm aber einfach nicht auf den RegExp-Syntax um das entsprechend zu ersetzen.

Alle anderen Tags innerhalb der XML sollten so erhalten bleiben, wie sie sind!

Könnt Ihr mir bitte helfen?

Gruß
matthias
 
wenn die tags genau so heissen, dann kannst du auch ein einfaches string-basiertes suchen und ersetzen machen, in dem fall drei mal für "Recommendations", "Referrals" und "Accessories", d.h. suche nach "Slider name="Recommendations" und ersetze durch "SliderRecommendations".

wenns mit regex sein soll, dann muss der neue string auf den match des regex zurückgreifen -> \1
Python:
import re
a = '<Slider name="Recommendations"><Slider name="Referrals"><Slider name="Accessories">'
b = re.sub(r'Slider name=\"(Recommendations|Referrals|Accessories)\"', r'Slider\1', a)
print(b)  # '<SliderRecommendations><SliderReferrals><SliderAccessories>'

der von @Yuuri vorgeschlagene ansatz hat natürlich den vorteil, dass die position des "name" attributes dann egal ist.
Python:
from lxml import etree

xml = etree.fromstring("""
<root>
  <Slider foo="bar" name="Recommendations">
    <Slider name="Referrals">
      <Slider name="Accessories"/>
    </Slider>
  </Slider>
</root>
""")

for node in xml.xpath('//Slider[@name="Recommendations" or @name="Referrals" or @name="Accessories"]'):
    node.tag = "Slider%s" % node.attrib["name"]
    node.attrib.pop("name")

print(etree.tostring(xml, pretty_print=True, encoding=str))

das "foo" attribut bleibt erhalten und der node wurde trotzdem umbenannt, obwohl "name" woanders steht:
Code:
<root>
  <SliderRecommendations foo="bar">
    <SliderReferrals>
      <SliderAccessories/>
    </SliderReferrals>
  </SliderRecommendations>
</root>
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: DeusoftheWired und Blue_Moon
Und welche Sprache? Regex ist nicht dafür gemacht. Mit XPath den richtigen Node suchen und das Attribut ersetzen dauert nicht lange.
 
  • Gefällt mir
Reaktionen: RalphS
Wäre PL/SQL mit einem Oracle regexp_replace

Aufbaue der XML:
<article_details> <Sliders> <Slider name="Recommendations"> <artnr>a</artnr> <artnr>b</artnr> </Slider> <Slider name="Referrals"> <artnr>1</artnr> <artnr>2</artnr> <artnr>3</artnr> </Slider> <Slider name="Accessories"> <artnr>c</artnr> <artnr>d</artnr> </Slider> </Sliders> </article_details>

An die Artikelnummern 1,2 & 3 muss ich rankommen.
 
Zuletzt bearbeitet:
Zurück
Oben