Modifier XML avec un fichier de commandes
Je me demandais si il existe un moyen de créer un fichier de commandes qui peuvent modifier une ligne dans un document XML. La ligne doit être identifié par la ligne précédente. l'idée serait comme suit:
If line == Csetting name="BaseDirectory" serializeAs="String">
Next line = <value>User Input from begining of batch</value>
est quelque chose comme ça même possible ou suis-je en train de rêver en dehors de mes moyens? Merci pour l'aide et les réponses.
OriginalL'auteur Christopher B. Adkins | 2009-12-22
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement pourrait hack quelque chose ensemble dans un fichier de commandes qui fonctionne en quelque sorte. Mais il sera extrêmement douloureux. Tout d'abord, je ne connais pas de moyen fiable de la lecture des lignes dans des variables dans un fichier de commandes et de l'écriture au fichier inchangé. Vous pouvez échapper à la plupart des problématiques caractères (tels que
<
,>
,&
,|
, ...) mais il y a toujours des problèmes je n'arrivais pas à résoudre1 (comme inégalée guillemets) qui va provoquer de telles tentatives à l'échec horrible. Alors vous ne serait pas encore en mesure d'analyser le langage XML, mais vous préférez primitive de traitement de texte qui peut facilement échouer dès que peut-être les guillemets simples sont utilisés à la place des guillemets doubles. Ou un espace supplémentaire est jeté dans quelque part. Ou la ligne que vous cherchez est divisée en plusieurs lignes. Tous les XML valide, mais douloureuse à analyser lorsque aucun analyseur XML est autour de.Le fichier de commandes de la langue n'est pas vraiment adapté pour de telles tâches. Heck, il est à peine travaux de traitement de texte, mais XML est bien au-delà. Vous pouvez avoir plus de chance (et de plaisir), avec l'aide de VBScript et MSXML ou même PowerShell (le cas échéant).
VBScript est probablement le plus intelligent choix ici que vous pouvez compter sur elle existantes sur pratiquement n'importe quelle machine Windows.
Vous pouvez également utiliser XSLT et l'appeler à partir de la ligne de commande. Il y a assez de processeurs XSLT qui peut être utilisé et la génération d'un fichier XSLT est en fait beaucoup plus simple (mais faudra encore plusieurs escapings).
1 Notez que j'ai peut-être un fichier de commandes de l'utilisateur/programmeur, mais non la foi. Peut-être qu'il est facilement possible et je suis juste trop stupide pour voir.
son possible. juste que vous aurez besoin de plus de temps et d'efforts
Ainsi, les citations/s'échapper question à l'heure actuelle n'a pas de solution pour moi. Je ne peux pas lire une ligne comme
a|b"<>&
et l'écrire dans un fichier inchangé. Inégalée devis sera la cause de l'habitude mécanismes d'échappement à l'échec (set "foo=%foo:&=^&%"
).Merci pour l'entrée. J'ai un fichier batch qui va être en cours d'exécution d'autres processus sur une dll avec un .config (Format XML) ci-joint. J'espérais qu'il y a un moyen facile de boule dans certaines config de montage avec le lot, mais il semble que non. Merci encore pour la rapidité, mais encore très bien la réponse!
OriginalL'auteur Joey
En fait, j'ai une réponse pour cela. Oui c'est douloureux, cependant j'ai eu un problème similaire et je ne sais pas vraiment VBScript (si je suis sur la planification d'apprentissage,...) pour le moment, même si mon problème s'est produit avec une collègue d'avoir des clients et de 20 000 fichiers qu'ils flubbed à partir d'une conversion de données de l'extérieur. Tous les fichiers ont été xml et ils étaient tous disparu le même 2ème ligne du XML, ce qui a déclenché une refile du document, nous étions importation.
J'ai écrit un standard script batch en tandem avec un autre que j'ai trouvé sur StackOverflow qui m'a permis de couper les fichiers en 2 parties et puis entre eux insérer le code que je voulais. Maintenant mon seul problème (probablement dû à la paresse ou à mon manque de connaissances, de la patience) était que je ne pouvais pas échapper à la < , > problème. Le script n'arrêtais pas de penser que j'étais en train d'écrire dans un fichier, ce qui n'était pas valide. J'ai essayé toutes sortes de façons d'utiliser ce personnage, mais je voulais qu'il soit dans une forme variable. Inutile de dire que j'ai eu de travail (très bien même)...
Ci-dessous est le fichier lisez-moi, j'ai fourni à mon collègue, le long avec le code de chaque fichier.
README.txt
Problème:
Quantité Massive de fichiers sont manquants d'une chaîne ou d'un morceau de code et doivent être modifiés
Solution:
Cet outil prend en outre les fichiers et les injecte une chaîne ou un morceau de code, puis mettre les fichiers dans un autre emplacement.
Il y a un total de 4 fichiers qui viennent avec cet outil.
Ce que vous devez faire:
Modifier String_Insert_Launcher et placez ce fichier dans le répertoire avec les fichiers que vous souhaitez modifier. NOTE Il est impératif que ce fichier dans le même dossier que TOUT le reste de vos fichiers que vous souhaitez éditer.
Vous avez besoin de modifier les variables dans le fichier de correspondance, des système de fichiers
batchpath
Modifier InsertString.chauve-souris et placez ce fichier dans le même répertoire que vous avez défini le batchpath variable au-dessus de
Vous avez besoin de modifier les variables de ce fichier pour correspondre à votre système de fichiers
insertpath
$ destpath
top_last_line
insert_last_line
bot_last_line
Modifier l'insert.txt et placez ce fichier dans le même répertoire que vous avez défini le insertpath ci-dessus
Vous avez besoin de mettre la chaîne(s) que vous voulez insérer dans votre fichier à l'intérieur de ce document texte
Vérifier vos journaux et assurez-vous que le nombre de fichiers dans le "Modified_Filelist.txt" (qui se trouve dans l' %insertpath%) est le même que le nombre de fichier que vous avez commencé avec.
Ventilation des fichiers:
* insert.txt *
À l'intérieur de ce fichier, vous voulez mettre le texte que vous souhaitez inséré dans les fichiers de la cible. La raison pour utiliser un fichier séparé est ainsi que les caractères spéciaux (>,<,/,\,|,^,%,etc...) ne sont pas traités comme des arguments dans le fichier de commandes.
Ce fichier doit ÊTRE dans le même emplacement que la variable que vous allez définir dans InsertString.chauve-souris appelée "insertpath" ou référencées dans le fichier de commandes en %insertpath%.
* InsertString.bat *
À l'intérieur de ce fichier, vous trouverez les variables qui doivent être définis pour que le script fonctionne.
Les Variables incluses:
Ce fichier doit ÊTRE dans le même emplacement que la variable que vous allez définir dans String_Insert_Launcher.chauve-souris appelée "batchpath" ou référencées dans le fichier de commandes en %batchpath%.
* String_Insert_Launcher.bat *
C'est le script que vous allez exécuter pour modifier tous les fichiers. Lancer ce script batch à PARTIR du dossier avec les fichiers que vous souhaitez modifier. Ce fichier attrape tous les noms de fichiers et exécute le InsertString.bat SUR tous ces fichiers.
À l'intérieur de ce fichier, vous trouverez une grandeur qui nees d'être ensemble pour que le script fonctionne.
Variable inclus:
batchfilepath
- C'est l'emplacement de la réelle fichier de commandes qui fait tout le travail. Cet emplacement est JUSTE le chemin, non compris les noms de fichiers.FICHIER #1: String_Insert_Launcher.chauve-souris
FICHIER n ° 2: Insert_String.chauve-souris
FICHIER #3: Insert.txt
Dans votre cas, vous pourriez être en mesure d'utiliser 2 fichiers...un avec
<value>
et une avec</value>
(Je sais que c'est bâclé, mais il fonctionne...)
Puis, à partir de mon script batch InsertString.chauve-souris vous suffit de mettre :boucle suivante 2x (un pour chacun de vos fichiers) et dans entre eux vous mettez echo.%userInputFromBeginningofBatch% >> File.xml
Comme je l'ai dit, je sais que c'est salissant et vous pouvez doe il est beaucoup plus facile en VBScript, mais pour ceux d'entre nous qui ne le savent pas, c'est une solution qui ne fonctionne pas.
Ceci est mon premier post ici sur StackOverflow, mais j'ai effectivement eu ce travail w/o aucun problème. J'ai remarqué que vous obtenez un espace supplémentaire après les lignes... je vais regarder en arrière dans le code et voir si je peux l'éviter, cependant je n'ai pas de problèmes de chargement du xml avec les espaces. Comme pour les lignes vides, vous avez raison. Mais le résultat final ici est fichiers en cours d'édition. Je n'ai jamais dit que ce serait joli!!! Merci pour les +1 et les commentaires, malade de regarder dans l'espace.
OriginalL'auteur rud3y
Excusez-moi. Je m'excuse d'avance pour ce post. Je sais que c'est un très vieux sujet, mais après avoir lu les réponses ici, je ne pouvais pas résister à la tentation de poster cette réponse.
Le traitement d'un fichier XML via un programme de commandes n'est pas seulement simple et directe, mais à mon humble avis, plus facile que toute solution équivalente en VBScript, PowerShell, etc. Ici, il est:
Le seul problème avec le programme précédent est que il supprimer les lignes vides dans le fichier XML, mais ce détail peut être fixé dans une façon très simple par l'ajout d'un couple de commandes plus. Précédent programme peut être modifié de ne pas cocher la ligne complète (comme l'OP l'origine de la demande), mais il faut vérifier trois parties dans le sens de la dernier exemple VBScript:
OriginalL'auteur Aacini
XML n'est pas basé sur la ligne, de sorte que l'hypothèse que vous pouvez regarder pour quelque chose dans le fichier en cochant sur une ligne-par-ligne de base, est vulnérable à des problèmes, ou s'appuie sur d'autres hypothèses en plus de XML. (si vous êtes l'obtention de votre fichier à partir d'un certain type de logiciel, comment savez-vous qu'il est toujours à produire des lignes de sortie de cette façon?)
Cela dit, je voudrais prendre un coup d'oeil à JSDB Javascript, qui a E4X intégré. E4X, il est particulièrement simple à manipuler XML, aussi longtemps que vous pouvez le lire dans la mémoire; ce n'est pas une fonction de flux du système. Bien que vous pourriez utiliser JSDB sans E4X et poignée e/S de fichier à l'aide de flux:
OriginalL'auteur Jason S
sûr, en mode natif, vous pouvez utiliser le traitement par lots, mais je vous recommande d'apprendre et d'utiliser vbscript au lieu
enregistrez le script sous modifier.vbs et dans le lot
vbscript est le meilleur que vous avez obtenu en plus de paralyser lot, si vous détestez l'idée d'utiliser d'autres outils de gawk/sed/Python/Perl ou autres parseurs xml/écrivains. Sinon, vous devriez envisager d'utiliser ces outils de meilleure qualité.
S - pouvez-vous recommander une meilleure solution s'il vous plaît. Merci!
Si vous utilisez un script comme celui-ci, très bien. Mais l'utilisation de l'objet XML à modifier le XML. sinon, votre échapper problème demeure. Il n'y a rien de mal avec VBScript - c'est une bonne alternative si vous ne pouvez pas compiler quelque chose.
OriginalL'auteur ghostdog74