在XML中查找和替换值(动态)

时间:2014-10-02 13:57:01

标签: python xml xml-parsing

我有以下XML代码(这是jmeter负载测试的脚本),例如:

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
     <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
     <elementProp name="ThreadGroup.main_controller" elementType="LoopController">
       <boolProp name="LoopController.continue_forever">false</boolProp>
       <stringProp name="LoopController.loops">10</stringProp>
     </elementProp>
     <intProp name="ThreadGroup.num_threads">1000</intProp>
     <intProp name="ThreadGroup.ramp_time">1</intProp>
     <longProp name="ThreadGroup.start_time">1363247040000</longProp>
     <longProp name="ThreadGroup.end_time">1363247040000</longProp>
     <boolProp name="ThreadGroup.scheduler">false</boolProp>
     <longProp name="ThreadGroup.duration">0</longProp>
     <longProp name="ThreadGroup.delay">0</longProp>
   </ThreadGroup>

我希望更改动态值的常量值(如现在 - 10和1000)中命名为 LoopController.loops ThreadGroup.num_threads 的参数(例如10 + 10和1000 + 100)循环。

我是Python的新手,对不起。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

目前还不清楚您想要做什么,但此解决方案使用lxml库来解析您的示例XML数据并进行您描述的更改。

XPath表达式//*只是查找数据中的每个元素,后续的for循环检查找到的每个元素的name属性,看它是否是那些想要的元素之一。如果匹配,则text属性将更改为您描述的值。显然,您喜欢的任何字符串都可以放在这里。

from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse('thread_group.xml', parser)

for e in tree.xpath('//*'):
    name = e.get('name')
    if name == 'LoopController.loops':
        e.text = '10+10'
    elif name == 'ThreadGroup.num_threads':
        e.text = '1000+1000'


print(etree.tostring(tree, pretty_print=True))

<强>输出

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
  <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
  <elementProp name="ThreadGroup.main_controller" elementType="LoopController">
    <boolProp name="LoopController.continue_forever">false</boolProp>
    <stringProp name="LoopController.loops">10+10</stringProp>
  </elementProp>
  <intProp name="ThreadGroup.num_threads">1000+1000</intProp>
  <intProp name="ThreadGroup.ramp_time">1</intProp>
  <longProp name="ThreadGroup.start_time">1363247040000</longProp>
  <longProp name="ThreadGroup.end_time">1363247040000</longProp>
  <boolProp name="ThreadGroup.scheduler">false</boolProp>
  <longProp name="ThreadGroup.duration">0</longProp>
  <longProp name="ThreadGroup.delay">0</longProp>
</ThreadGroup>