Question

Parfois, j'ai besoin d'extraire rapidement certaines données arbitraires à partir de fichiers XML pour les mettre dans un format CSV.Quel est votre meilleur pratiques pour le faire dans le terminal Unix?J'aimerais des exemples de code, donc par exemple comment puis-je obtenir le problème suivant a été résolu?

Exemple d'entrée XML:

<root>
<myel name="Foo" />
<myel name="Bar" />
</root>

Mon choix de sortie CSV:

Foo,
Bar,
Était-ce utile?

La solution

Si vous voulez juste le nom des attributs de n'importe quel élément, voici un rapide mais incomplète solution.

(Votre exemple de texte dans le fichier exemple)

grep "nom" exemple | cut-d"\"" -f2,2 | xargs -I{} echo "{},"

Autres conseils

La réponse de pierre est correcte, mais elle génère un suiveur de ligne de flux.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"/>
  <xsl:template match="root">
    <xsl:for-each select="myel">
      <xsl:value-of select="@name"/>
      <xsl:text>,</xsl:text>
      <xsl:if test="not(position() = last())">
        <xsl:text>&#xA;</xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Par exemple, il suffit d'exécuter

xsltproc stylesheet.xsl source.xml

pour générer le fichier CSV résultats sur la sortie standard.

Utiliser la ligne de commande du processeur XSLT comme xsltproc, saxon ou xalan pour parser le XML et de générer un fichier CSV.Voici un exemple, qui dans votre cas est la feuille de style:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="root">
        <xsl:apply-templates select="myel"/>
    </xsl:template>

    <xsl:template match="myel">
        <xsl:for-each select="@*">
            <xsl:value-of select="."/>
            <xsl:value-of select="','"/>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
    </xsl:template> 
</xsl:stylesheet>

XMLStarlet est une ligne de commande trousse à outils de requête/modifier/consulter/transformer Les documents XML (pour plus d'informations, voir http://xmlstar.sourceforge.net/)

Pas de fichiers à écrire, juste tuyau de votre fichier de xmlstarlet et appliquer un filtre xpath.

cat file.xml | xml sel -t -m 'xpathExpression' -v 'elemName' 'literal' -v 'elname' -n

-m expression -v valeur "inclus littérale -n saut de ligne

Donc, pour votre xpath xpath expression serait //myel/@nom qui pourrait offrir les deux valeurs d'attribut.

Outil très pratique.

Voici un petit script ruby qui n' exactement ce que votre question demande (pull un attribut appelé " nom "à partir d'éléments appelés "myel').Doit être facile à généraliser

#!/usr/bin/ruby -w

require 'rexml/document'

xml = REXML::Document.new(File.open(ARGV[0].to_s))
xml.elements.each("//myel") { |el| puts "#{el.attributes['name']}," if el.attributes['name'] }

Répondant à la question d'origine, en supposant fichier xml est "test.xml" qui contient:

<root> <myel name="Foo" /> <myel name="Bar" /> </root>

cat text.xml | tr -s "\"" " " | awk '{printf "%s,\n", $3}'

votre fichier de test est en test.xml.

sed -n 's/^\s`*`&lt;myel\s`*`name="\([^"]`*`\)".`*`$/\1,/p' test.xml

Il a ses pièges, par exemple si elle n'est pas strictement étant donné que chaque myel est sur une seule ligne que vous avez à "normaliser" le fichier xml de la première (de sorte que chaque myel est sur une ligne distincte)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top