12
votes

Nombre de comptage d'élément XML à partir de la coque Linux

Mon XML apercevoir quelque chose comme ceci:

<elements>
<elem>
....bunch of other elements
</elem>
</elements>


0 commentaires

6 Réponses :


1
votes

Londres,

essayer fgrep -c '' $ nom de fichier

fgrep est un utilitaire UNIX standard, pas du tout sûr de Linux cependant. Le commutateur -c signifie compte .

acclamations. Keith.

PS: Il est continuellement plus facile de compter les étiquettes de fermeture, Coz, ils n'ont pas d'attributs; -)


3 commentaires

Compter les balises de fermeture peut donner des résultats incorrects, en raison de la forme courte pour une étiquette fermée. De plus, l'habituel 'Vous ne pouvez pas analyser XML via Regex'-arguments s'appliquent, par exemple: << CDATA [[]] >>


Ouais ... n'avait pas pensé à s ... plus gros!


De plus, les lignes correspondantes du nombre de greps et non des correspondances. Donc, s'il y a plusieurs dans une seule ligne, ils augmenteront le compteur d'un seul.



0
votes

@OP, tous les solutions grep a une "défaillance" fondamentale en ce qu'elle manquera des comptes si plus de 1 est une ligne. Utilisez awk pour compter programmatiquement xxx

Cette solution suppose que vous savez comment vos tags d'élève seront comme. Non ou ceux avec des attributs supplémentaires.


2 commentaires

Merci pour votre réponse, mais j'ai besoin de passer du contenu de fichier à cela avec un tuyau puis de taper Awk / Grep ou quelle que soit la commande, est-ce possible avec cela? Comment économisez-vous un script awk comme .awawk? Actuellement, je reçois awk: ^ Erreur de syntaxe


Enregistrez-le comme un script shell. Appelez ensuite le script Shell de la ligne de commande. par exemple ./ myscript.sh . Assurez-vous de le rendre exécutable.



1
votes

grep seul ne vous aidera pas dans tous les cas, mais c'est un cas facile pour XMLSTARLET . Vous pouvez correspondre à elem avec xmlstarlet , puis comptez les nouvelles lignes avec wc -l . Les nouvelles lignes moins 1 sont le nombre d'éléments.

Exemple Yourfile.xml: xxx

Utilisez xmlstarlet et wc-l : xxx

sortie: 3


0 commentaires

15
votes

L'outil xml_grep fait ce que vous voulez - essayez ce que vous voulez - essayez ce que vous voulez: xxx

que l'utilitaire est dans le xml-twig-outils Forfait sur Debian / Ubuntu, et le La documentation est ici . < / p>


6 commentaires

@Mark Longair Cela semble bien, mais je ne trouve pas cette commande sur mon Linux, comment puis-je l'installer?


@London: Quelle distribution utilisez-vous?


Je n'ai pas accès à un système de Red Hat, mais vous pouvez essayer: Yum Installez Perl-XML-Twig


Il s'installe également avec cpan xml :: Twig


Vous pouvez même écrire xml_grep -count elem exemple.xml (pas besoin de la //)


Travaillé comme un charme. Je n'ai eu que d'obtenir le colis installé! Merci Mark



3
votes

n'utilise pas d'expressions régulières pour analyser ou numériser des fichiers XML forts>

La responsabilité obligatoire étant tirée, voici ma solution: p>

xmllint --nocdata --format myfile.xml | grep -c '</elem>'
  • espaces parasites (--format) li>
  • Plusieurs étiquettes de fermeture sur une seule ligne (--Format) li>
  • Sections CDATA (--NOCDATA) LI> ul>

    Cependant, vous serez pris par la déclaration et les valeurs par défaut de Nasty Nast Namespace. P> P>


2 commentaires

Vous déclarez n'utilisez pas de regexnes et pourtant vous donner une solution à l'aide de la regex?


@London C'est l'ironie ... L'avertissement doit être émis à chaque occasion. Bien que vous ayez semblé rechercher une solution de la coquille. Je vous ai donné un qui a, imho, un bon compromis entre l'exactitude et la rapidité.



11
votes

Vous pouvez également utiliser xmllint : xxx


2 commentaires

Actuellement, c'est la meilleure réponse jusqu'à présent dans ce fil. L'utilisation d'un outil XML approprié est la voie à suivre, pas une solution hacky Grep.


Et si l'élément a un préfixe d'espace de noms?