多数のxmlファイルの<values>データを置き換えます


0

たとえば、特定の構造を持つ多くのxmlファイルがあります。

<Class="Object">
    <Speed>25</Name>
    <Price>3</Price>

特定のフィールドの値を置き換えたい。手動でもできますが、時間がかかります。

たとえば、すべてのファイルでSpeedを100に、Priceを50に設定する必要があります。

今私がしているのは、各ファイルを開き、Speedを検索してから、そこに50と手動で入力するなどです。時間がかかりますので、Notepad ++または他のソフトウェアを介して自動的に行う方法があるかどうかを知りたいと思います。

前もって感謝します!



固定文字列を与えられた正規表現を使用する必要さえありますか?<Speed>25</Speed>この文字列をに変更し<Speed>100</Speed>、Notepad ++、Ctrl-Shift + Fを開いて[ファイルから検索]を開くと 仮定します。ファイルのディレクトリを選択するだけです。が何であるかを検索し<Speed>25</Speed><Speed>100</Speed>「で置換」、「ファイルで置換」をクリックします。その後、他の文字列についても同じことができます。
HelpingHand

DavidPostill、mchの技術情報が多すぎて、私の質問とは無関係です。HelpingHand、値は常に異なるということです。あるファイルではSpeedは25で、別のファイルでは30などです。そのため、あなたが提案することはできません。
マイク

それは実際にあります<Speed>25</Name><Speed>25</Speed>
トト

回答:


0

この目的のためにPython3.xを試すことができます。多くのプラットフォームで利用可能なPythonを使用しました。このスクリプトをWindowsとUbuntuでテストしました。私は問題を観察していません。このスニペットはSpeed値のみを変更しますが、変数replace_whatを自由に変更して、必要に応じて変更できるようにしてください。

import os
import re
my_dir = 'C:\\temp2\\my_folder\\'
replace_what = '(?<=<Speed>)(\d+)(?=<)'
replace_with = '100'
# loop through all files in directory
for fn in os.listdir(my_dir):
    #print(fn)
    pathfn = os.path.join(my_dir,fn)
    if os.path.isfile(pathfn):
        file = open(pathfn, 'r+')
        new_file_content=''
        for line in file:
            p = re.compile(replace_what)
            new_file_content += p.sub(replace_with, line)
        file.seek(0)
        file.truncate()
        file.write(new_file_content)
        file.close()

ありがとう!私はそれをテストし、大丈夫です。すべてのサブディレクトリも検索するように変更できますか?私は自分のファイルがサブディレクトリにあると言うのを忘れたことに気付いた。たとえば、/ my folder / car1 ... / car2 / car3などがあります。
マイク

0

これが、スクリプトの再帰バージョンです。指定されたディレクトリとそのすべてのサブディレクトリ内のファイルの値を変更します。

import os
import re
my_dir = 'C:\\temp2\\my_folder\\'
replace_what = '(?<=<Speed>)(\d+)(?=<)'
replace_with = '100'
# loop through all files in directory recursively
for root, directories, filenames in os.walk(my_dir):
    for filename in filenames:
        if os.path.isfile(os.path.join(root,filename)):
            file = open(os.path.join(root,filename), 'r+')
            new_file_content=''
            for line in file:
                p = re.compile(replace_what)
                new_file_content += p.sub(replace_with, line)
            file.seek(0)
            file.truncate()
            file.write(new_file_content)
            file.close()

0

あなたの例にはタイプミスがあり、あなたは持っていると思います <Speed>25</Speed>

  • Ctrl+F
  • 何を見つける: (?<=<Speed>)\d+(?=</Speed>)
  • と置換する: 100
  • ラップアラウンドをチェック
  • 正規表現を確認する
  • Replace all

説明:

(?<=<Speed>)    : lookbehind, zero-length assertion to make sure we have "<Speed>" before current position
\d+             : 1 or more digits
(?=</Speed>)    : lookahead, zero-length assertion to make sure we have "</Speed>" after current position

置換:

100 : the new speed value

価格についても同じことSpeedPrice行い、上記の手順で置き換えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.