2017-05-17 7 views
1

作動しないI 2つのXMLノードの値を変更したい - SET_STATUS FILEDATAがに存在するこのXML列ことがテキストであるためパイソン - 正規表現を持つ2つのノード間の更新XML値 - re.subは

<ws:genericAction>SET_STATUS</ws:genericAction> 

。それは、正規表現を書いた:

re.sub(r'<\/ws:genericAction>\s*(.*)(?=\n<\/ws:genericAction>)', "New Text", filedata, flags=re.IGNORECASE) 

すべてのプログラム:あなたのための

with open("createUser.txt", 'r') as file: 
    filedata = file.read() 
re.sub(r'<\/ws:genericAction>\s*(.*)(?=\n<\/ws:genericAction>)', "New Text", filedata, flags=re.IGNORECASE) 
with open("createUser.txt", 'w') as file: 
    file.write(filedata) 

感謝を

filedata = re.sub(r'(<ws:genericAction>)([^<>]+)(?=<\/ws:genericAction>)', "\\1New Text", filedata, flags=re.IGNORECASE) 

https://docs.python.org/3/library/re.html#re.sub

+0

パーサーを使用します(例: 'lxml'。 – Jan

答えて

1

re.sub()が行わに文字列を変更しません、それは交換後の文字列を返し助けます収量

b'<root xmlns:ws="http://example.com"> 
     <ws:genericAction>Something new here</ws:genericAction> 
    </root>' 
+0

ありがとう、今、私の行がすべて「新しいテキスト」で消えてしまった後、タグ間のテキストだけを置き換える正規表現を提供する方法はありますか? SET_STATUS Start

+0

@Start、それは '新しいテキスト'になるはずですか? – RomanPerekhrest

+0

はい、まさに私が達成しようとしているものです。 – Start

0

パーサとソリューション:

from lxml import etree 

# our test string 
xml = '''<root xmlns:ws="http://example.com"> 
      <ws:genericAction>SET_STATUS</ws:genericAction> 
     </root>''' 

# the dom 
root = etree.fromstring(xml) 

# our item(s) as an xpath expression 
item = root.xpath(".//ws:genericAction[text()='SET_STATUS']", namespaces = {'ws': 'http://example.com'}) 

# modify the first one 
item[0].text = "Something new here" 

# print the new dom 
etree.tostring(root, pretty_print=True) 

この

+0

この解決の問題点は、最初の反復後に別のパラメータを指定したい場合、見つからないということです。これは[text()= 'SET_STATUS']のみを検索するためです。これが正規表現の理由ですラッピングテキストがより効率的です。 – Start

+0

@Start:正規表現だけでは "効率的"ではないかと疑いがあります。あなたは 'lxml'と*の組み合わせで正規表現を使うことができます。 – Jan

関連する問題