Remplacer le contenu dynamique dans le fichier XML
Résumé: j'ai besoin de créer un script Bash pour modifier le texte à l'intérieur d'un nœud automatiquement chaque semaine. Le script va correspondre le nœud et remplacer le texte à l'intérieur (si c'est possible)? Comment puis-je faire?
Long Résumé:
- Je héberger un serveur Minecraft qui a des magasins, qui ont chacune leur propre .fichier xml dans le /ShowcaseStandalone/ffs-stockage/répertoire. Tous les dimanches, mon serveur redémarre et exécute plusieurs commandes dans le terminal pour réinitialiser plusieurs choses. Une chose que je suis en train de faire le changement est l'un des magasins. Je suis désireux de modifier le texte dans le noeud <itemstack> et le texte dans le noeud <prix>. Je suis simplement envie de prendre le texte à partir d'un .fichier txt dans un dossier différent, et de l'insérer dans ce nœud. Le problème, c'est que le texte dans le nœud change chaque semaine. Est-il possible de remplacer la ligne ou le texte dans un délai de deux nœuds à l'aide de bash?
Fichier XML:
<?xml version="1.0" encoding="UTF-8"?>
<scs-shop usid="cac8480951254352116d5255e795006252d404d9" version="2" type="storage">
<enchantments type="string"/>
<owner type="string">Chadward27</owner>
<world type="string">Frisnuk</world>
<itemStack type="string">329:0</itemStack>
<activity type="string">BUY</activity>
<price type="double">55.0</price>
<locX type="double">487.5</locX>
<locY type="double">179.0</locY>
<locZ type="double">-1084.5</locZ>
<amount type="integer">0</amount>
<maxAmount type="integer">0</maxAmount>
<isUnlimited type="boolean">true</isUnlimited>
<nbt-storage usid="23dffac5fb2ea7cfdcf0740159e881026fde4fa4" version="2" type="storage"/>
</scs-shop>
Système D'Exploitation: Linux Ubuntu 12.04
XML la manipulation en utilisant exclusivement
bash
? Pourquoi se limiter?Désolé, j'ai eu à ad < et > balises parce qu'il a tué mon nœuds, mais non, j'ai besoin de remplacer le texte dans les nœuds "itemstack" et "prix"
Est-il un autre moyen de le faire à partir d'un terminal? Parce que ces commandes s'exécutent sur le serveur de l'arrêt
Je le recommande python -- est-ce que votre serveur avez installé python, ou peut-il? Si non, java peut être une autre option.
OriginalL'auteur Clucky | 2012-11-13
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
xmlstarlet
pour modifier unXML
fichier dans unshell
comme ceci :NOTE
"/scs-shop/price[@type='double']"
est un Xpath expressionxmlstarlet ed --help
Je peux vous donner la syntaxe complète si vous me donnez un XML valide
Vous pouvez tester de cette façon :
xmlstarlet val file.xml
Là, je l'ai corrigé. Désolé, je suis tout nouveau à stackoverflow donc je ne sais pas comment formater correctement. Mais il doit être un fichier xml valide maintenant.
A travaillé comme un charme. Merci beaucoup!
OriginalL'auteur Gilles Quenot
Le XML est cool, mais si vous avez besoin de faire un usage normal, bash outils, vous pouvez modifier une ligne à l'aide de sed. Par exemple:
Ce sera de remplacer le prix par 123.
Que sed commande semble ardue, alors permettez-moi de le décomposer:
\(<price.*>\)[^<>]*\(<\/price.*\)
est le motif de match.\(
...\)
sont des parenthèses pour grouper.<price.*>
correspond à l'ouverture de l'étiquette de prix.[^<>]*
correspond à rien, sauf des crochets, et dans ce cas, correspondre au contenu de l'étiquette de prix.<\/price.*
correspond à la fin de l'étiquette de prix. Slash est un délimiteur de sed, j'ai donc échapper avec une barre oblique inverse.\1$PRICE\2
est le texte à remplacer le texte correspondant.\1
se réfère à la première appariés parenthèse groupe, qui est l'ouverture de l'étiquette de prix.$PRICE
est la variable avec le prix souhaité.\2
se réfère à la deuxième parenthèse groupe, dans ce cas, la balise de fermeture.Si linux est venu avec un bon outil xml comme xmlstarlet alors je suis d'accord que c'est la mauvaise façon. Jusqu'à ce qu'il n', sed est mon outil. De façon réaliste, vous pouvez utiliser sed dans 99% des cas, y compris celui-ci.
Je n'ai pas dit "qui ne fonctionnent pas", mais : "ce n'est pas fiable". Dans un cas simple comme cela, cela semble "bien" pour certaines personnes, mais ce qui arrive quand le code XML devient de plus en plus compliqué avec les balises imbriquées ? Je parle de manière fiable à fait les choses propres.
sudo apt-get install xmlstarlet
n'est pas une grosse affaire."mais je pense que c'est tout aussi inefficaces que exigeant chaque trivial HTML tâche de traitement d'être manipulé par un véritable moteur d'analyse" est une citation de l'article du blog que vous citez. Peu importe, pour l'anecdote: je préfère le xmlstarlet solution. Mais si xmlstarlet n'est pas disponible, sed obtiendrez er fait.
apt-get install n'est pas si facile, par exemple, vous avez besoin d'une connexion internet et de l'espace libre sur le HD (si vous utilisez quelque chose comme Backtrack vous avez 4 go de disque virtuel et si elle est pleine, il se bloque). Et récemment, mon système apt cassé, et je ne pouvais pas utiliser apt-get pour installer quoi que ce soit pour 3 mois!
OriginalL'auteur Dan Bliss
Je n'ai pas eu le luxe d'avoir xmlstarlet.
J'ai trouvé une solution mais simplement en faisant une ligne de remplacement;
template-parameter.xml
Extrait de
Résultat
OriginalL'auteur Denno