2010-09-10 2 views
0

J'ai un gros fichier XML que je suis en train d'éditer avec BBEdit.Suppression d'un ensemble de tags d'un autre ensemble à l'aide d'expressions régulières

Dans le fichier XML, qui est une reconstitution numérique d'un ancien journal, se trouve un texte entouré de balises de note. Cependant, certaines étiquettes de note comportent des guillemets inclus dans les guillemets qui y sont imbriqués. Je dois supprimer toutes les occurrences de guillemets des balises de note, tout en conservant le contenu réel des balises de guillemets. Ainsi, l'exemple deviendrait:

<note>Example of a note, but "here is a quotation within the note"</note> 

Je l'ai utilisé GREP BBEdit pour éliminer avec succès certains d'entre eux, mais je commence à être coincé avec les balises de notes plus complexes qui vont sur plusieurs lignes ou qui ont du texte entre les deux ensembles différents d'étiquettes. Par exemple:

<note>Example of a note, <quote>"with a quotation"</quote> and a <quote>"second quotation"</quote> along with some text outside of the quotation before the end of the note.</note> 

Quelques citations peuvent durer plus de 10 lignes. Utiliser \ r dans mon expression rationnelle ne semble pas aider.

Je devrais aussi dire que les balises de citation peuvent exister en dehors des balises de note, ce qui exclut la possibilité de simplement trouver en bloc /? Quote et de le supprimer. Je dois toujours utiliser les balises de citation dans le document, mais pas dans les balises de note.

Un grand merci pour toute aide.

Répondre

2

Ceci est vraiment facile avec XSLT:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="quote"> 
    <xsl:apply-templates select="node()|@*" /> 
    </xsl:template> 
</xsl:stylesheet> 

Appliquer cette feuille de style à votre fichier XML avec un processeur XSLT de votre choix. Il y a des outils qui fonctionnent sur la ligne de commande, par exemple.

0

Sans restrictions sur la façon dont le XML est formé, je suis à peu près sûr que cela sort du cadre des langages réguliers et des langages contextuels, ce qui signifie que les expressions régulières ne vont pas vous aider. Si la structure du XML est simple (aucun noeud imbriqué dans des noeuds ou des guillemets imbriqués entre guillemets), vous pourriez faire quelque chose dans le sens d'un remplacement global de <node>(!</node>)<quote>(!</quote>)</quote>(!</node>)</node> avec <node>\1\2\3</node>, mais vous utilisez probablement le mauvais outil pour le travail. Comme l'une des notes des autres réponses, XSLT pourrait vous aider, ou vous pourriez utiliser une bibliothèque d'analyse XML pour écrire un programme simple pour supprimer les balises que vous recherchez.

Questions connexes