2010-03-25 7 views
0

Je ne sais pas si je peux utiliser regex pour cela, mais je veux remplacer quelque chose dans ce xml:Remplacer le texte par un autre texte dans la même ligne

<custom-attribute name="Attribute_1" dt:dt="string">Danny Boyle</custom-attribute> 
<custom-attribute name="DVD-releasedatum" dt:dt="string">06/10/1999</custom-attribute> 

devrait devenir

<Attribute_1>Danny Boyle</Attribute_1> 
<DVD-releasedatum>06/10/1999</DVD-releasedatum> 

Enlever ceci de la première étiquette n'est pas dur, mais comment je peux fermer mon étiquette nouvellement formée?

+2

Vous devriez mieux utiliser XSLT. – Gumbo

Répondre

1

En utilisant par exemple gvim, cela faire:

:%s/.*name="\([^"]*\)"[^>]*>\([^<]*\)<.*/<\1>\2<\/\1>/cg 

Ceci est la partie correspondant:

.*name="\([^"]*\)"[^>]*>\([^<]*\)<.* 

Ceci est la remplacer une partie:

<\1>\2<\/\1> 
+0

Le téléchargement de gvim était la solution la plus rapide. xslt a l'air intéressant, mais je devrais en apprendre plus à ce sujet. Comment puis-je essayer cette regex dans sed, cependant? – skerit

+0

Bien que je ne sois pas sûr de la gestion de sed des groupes de sélection, je crois qu'il devrait accepter le même modèle: 'sed 's /.* name =" \ ([^ "] * \)" [^>] *> \ ([^ <]*\)<.*/<\1> \ 2 <\/\1>/g'' filename.xml –

1

Si vous voulez faire cela une fois, Regex remplacer peut être une option. Sinon, il existe de meilleurs moyens de transformer XML, par exemple, XSLT.

Pour utiliser Regex, vous pouvez remplacer

\<custom-attribute.*?name="(\w+)".*?\>(.*?)\</custom-attribute\> 

avec

<$1>$2</$1> 

Remplacer 1 $ et 2 $ avec tout ce que les références sont appelés à vous programme. Enregistrer une première sauvegarde, bien =)

+0

Pourquoi ajoutez-vous une fin '.' au texte de remplacement ... – kennytm

+0

Eh bien, c'est la fin de la phrase commençant par" Pour l'utilisation ... ". Mais je suis d'accord, c'est trompeur ici. Je vais m'en débarrasser. =) – Jens

1

Cela fonctionne pour C# (pas sûr de ce que la langue que vous utilisez):

string input = "<custom-attribute name=\"Attribute_1\" dt:dt=\"string\">Danny Boyle</custom-attribute>\r\n<custom-attribute name=\"DVD-releasedatum\" dt:dt=\"string\">06/10/1999</custom-attribute>"; 

string output = Regex.Replace(input, "<custom-attribute name=\"(.*?)\".*?>(.*?)</custom-attribute>", "<$1>$2</$1>"); 

sortie:

<Attribute_1>Danny Boyle</Attribute_1> 
<DVD-releasedatum>06/10/1999</DVD-releasedatum> 
+0

Vous devriez rendre votre. * S paresseux. – Jens

+0

@Jens - fait, merci. –

1
while(<DATA>) 
{ 
    if($_=~s/^\<.*=\"(.*)\" .*\>([a-zA-Z]+|[0-9\/ ]+).*/<$1>$2<\/$1>/) 
    { 
     print $_; 
    } 
} 
__DATA__ 
<custom-attribute name="Attribute_1" dt:dt="string">Danny Boyle</custom-attribute> 
<custom-attribute name="DVD-releasedatum" dt:dt="string">06/10/1999</custom-attribute> 
2

Cela ressemble à un travail pour XSLT :

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="custom-attribute"> 
     <xsl:element name="{@name}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Ceci vous donne la sortie désirée, et est très flexible pour de futures modifications et extensions.

Questions connexes