Не на 100% уверен, что я делаю неправильно. К сожалению, мне нужно разбирать XML с регулярным выражением, а не с красивым супом или другим. Предполагается, что это заменить матч с комментариямиPython regex xml parse
КОД:
import re, shutil
TAG_NAME = 'ruleDefinition'
CASE_LABEL = 'case'
word_file = 'MetaData.txt'
xml_file = 'ProcessAll.xml'
extension = '.bak'
backup = xml_file + extension
# Create backup
shutil.copy2(xml_file, backup)
with open(word_file) as words:
regex = r'<[^>]+ field=$"({})"[^>]+>'.format(
'|'.join(
sorted((word.rstrip('\r\n') for word in words), key=len, reverse=True)
)
)
with open(xml_file, 'w') as new_xml:
with open(backup) as xml:
names = []
start = False
entry = ''
for line in xml:
# start tag
if re.findall(r'<{}[^>]*>'.format(TAG_NAME), line):
start = True
# end tag
if '</{}'.format(TAG_NAME) in line:
start = False
if names:
new_xml.write('<!-- Removed ' + ','.join(names) + ' -->\n')
names = []
# inside tag
if start:
if len(entry):
entry += line
if '<{}'.format(CASE_LABEL) in line:
entry += line
if '</{}'.format(CASE_LABEL) in line:
match = re.search(regex, entry)
if match:
name = match.group(1)
names.append(name)
else:
new_xml.write(entry)
entry = ''
continue
if len(entry):
continue
new_xml.write(line)
Файл называется в сценарии:
cat MetaData.txt
NORMALIZED_PRICE_REALTIME
STAMP_DUTY_FLAG_REALTIME
XML FILE:
<ruleDefinition name="ProcessAllFields" category="subrule" defaultContext="Security">
<case label="0xFBDE">
<!-- dec=64478, NORMALIZED_PRICE_REALTIME -->
<if>
<or>
<equal op1="$temp.updateAlways" op2="true"/>
<equal op1="#NORMALIZED_PRICE_REALTIME" op2="0"/>
</or>
<then>
<multiply op1="$inField.data" op2="$temp.pScale"
store="$NORMALIZED_PRICE_REALTIME" round="-3"/>
<appendField field="$NORMALIZED_PRICE_REALTIME"/>
</then>
</if>
</case>
<case label="0xFBDF">
<!-- dec=64479, STAMP_DUTY_FLAG_REALTIME -->
<if>
<or>
<equal op1="$temp.updateAlways" op2="true"/>
<equal op1="#STAMP_DUTY_FLAG_REALTIME" op2="0"/>
</or>
<then>
<assign to="$STAMP_DUTY_FLAG_REALTIME" from="$inField.data"/>
<appendField field="$STAMP_DUTY_FLAG_REALTIME"/>
</then>
</if>
</case>
</ruleDefinition>
В основном он удаляется все данные с строка «случай»
DESIRED РЕЗУЛЬТАТ
< --Removed NORMALIZED_PRICE_REALTIME, STAMP_DUTY_FLAG_REALTIME - />
* «Мне нужно разобрать XML с регулярным выражением, а не красивым супом или другим» * - ** почему?! ** – jonrsharpe
* Пожалуйста, прочтите следующее: http://blog.codinghorror.com/parsing-html-the -cthulhu-way/ –
http://stackoverflow.com/questions/1912434/how-do-i-parse-xml-in-python – frhd