[regular expression] delete tekst tussen XML tags

Pagina: 1
Acties:

  • -RenE-
  • Registratie: September 2001
  • Laatst online: 09-02 19:48
Gisteren heb ik een hele tijd gezocht naar een oplossing om uit een groot XML-bestand een aantal tags met tussenliggende tekst te wissen. Het is niet gelukt. Graag jullie hulp.

Ik heb het volgende stukje bestand:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[....]
 <column name="SampZipcode" type="VARCHAR" size="15">
      <vendor type="mysql">
        <parameter name="Field" value="SampZipcode"/>
        <parameter name="Type" value="varchar(15)"/>
        <parameter name="Null" value="YES"/>
        <parameter name="Key" value=""/>
        <parameter name="Default" value=""/>
        <parameter name="Extra" value=""/>
      </vendor>
    </column>
    <column name="RespCity" type="VARCHAR" size="15">
      <vendor type="mysql">
        <parameter name="Field" value="RespCity"/>
        <parameter name="Type" value="varchar(15)"/>
        <parameter name="Null" value="YES"/>
        <parameter name="Key" value=""/>
        <parameter name="Default" value=""/>
        <parameter name="Extra" value=""/>
      </vendor>
   </column>
[...]


en daar wil ik alles tussen en met de "vendor" tags uit verwijderen. Natuurlijk kan ik dat even scripten met python o.i.d., maar het zou ook moeten kunnen met Vim en regular expressions. Maar hoe?

Ik heb het zo geprobeerd:

code:
1
/<vendor\_.[^\/]*


Dit selecteert de hele start regel van de tag, maar niet het vervolg t/m de eindtag.

code:
1
/<vendor[vendor]\_.*


Maar hierbij selecteert de RE alles vanaf de starttag tot het einde van het bestand.

Verder heb ik nog allerlei combinaties geprobeerd.

Kan iemand mij helpen een goede RE op te stellen die dit probleem verhelpt? Ik probeer RE te leren, dus een beetje uitleg erbij is erg welkom.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je vermeld niet welke taal je wilt gebruiken; de syntax voor ungreedy expressions wil nog wel eens verschillen, maar zoiets zou het moeten worden (php):
PHP:
1
$xml = preg_replace('/<vendor .*?<\/vendor>/s', '', $xml);

edit: oh, python; tsja, dat ken ik niet :P

[ Voor 10% gewijzigd door crisp op 03-06-2006 12:08 ]

Intentionally left blank


Verwijderd

Als het XML is, kun je natuurlijk het best met XML tools aan de gang. Voor grote bestanden met SAX, voor kleinere met SAX of DOM.

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

crisp schreef op zaterdag 03 juni 2006 @ 12:07:
Je vermeld niet welke taal je wilt gebruiken; de syntax voor ungreedy expressions wil nog wel eens verschillen, maar zoiets zou het moeten worden (php):
PHP:
1
$xml = preg_replace('/<vendor .*?<\/vendor>/s', '', $xml);

edit: oh, python; tsja, dat ken ik niet :P
Misschien een domme vraag... Maar de regular expression toch gewoon hetzelfde lijkt me? :?

[ Voor 32% gewijzigd door CH4OS op 03-06-2006 12:53 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

GJ-tje schreef op zaterdag 03 juni 2006 @ 12:51:
[...]
Misschien een domme vraag... Maar de regular expression toch gewoon hetzelfde lijkt me? :?
Over het algemeen wel, maar er zijn in verschillende talen verschillende manieren om een expressie ungreedy te maken. Denk aan .*? en de ungreedy modifier. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Hadden ze voor dit soort XML transformaties niet XSLT uitgevonden?
Je kunt wel gaan rommelen met een text editor en regexes, maar dat blijft m.i. gewoon rommelen. Vim en regex hebben geen notie van XML, en zijn in dit geval doodgewoon niet de juiste tools denk ik.

[ Voor 14% gewijzigd door Verwijderd op 03-06-2006 14:35 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Waarom niet? Het lijkt me geen enkel probleem om een regexp te gebruiken in je texteditor voor dit probleem? Tuurlijk zijn er tools voor, maar dit probleem is zo simpel dat het ook met een regexp aardig waterdicht gemaakt kan worden.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • -RenE-
  • Registratie: September 2001
  • Laatst online: 09-02 19:48
-NMe- schreef op zaterdag 03 juni 2006 @ 14:37:
Waarom niet? Het lijkt me geen enkel probleem om een regexp te gebruiken in je texteditor voor dit probleem? Tuurlijk zijn er tools voor, maar dit probleem is zo simpel dat het ook met een regexp aardig waterdicht gemaakt kan worden.
Inderdaad leek dit probleem me zo simpel dat het in Vim goed opgelost zou kunnen worden. Helaas is het nog steeds niet gelukt.

code:
1
/<vendor .*?<\/vendor>


geeft in vim een niet gevonden foutmelding.

Ik zal nog eens zoeken naar ungreedy modifiers in Vim. Iemand anders nog een suggestie?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

-NMe- schreef op zaterdag 03 juni 2006 @ 14:18:
[...]

Over het algemeen wel, maar er zijn in verschillende talen verschillende manieren om een expressie ungreedy te maken. Denk aan .*? en de ungreedy modifier. :)
sommige talen/implementaties ondersteunen niet eens een ungreedy modifier, dan moet je hopen dat je wel ondersteuning hebt voor look-ahead assertions ;)

[ Voor 10% gewijzigd door crisp op 03-06-2006 16:19 ]

Intentionally left blank


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
-NMe- schreef op zaterdag 03 juni 2006 @ 14:37:
Waarom niet? Het lijkt me geen enkel probleem om een regexp te gebruiken in je texteditor voor dit probleem? Tuurlijk zijn er tools voor, maar dit probleem is zo simpel dat het ook met een regexp aardig waterdicht gemaakt kan worden.
Als het bij dit probleem blijft wel ja, maar vaak genoeg gebeurt het al snel dat je een nèt iets complexer probleem moet oplossen ;)
Pagina: 1