Adm Tea Asked:2020-01-16 17:56:08 +0000 UTC2020-01-16 17:56:08 +0000 UTC 2020-01-16 17:56:08 +0000 UTC 同名xml标签内的数字算术运算? 772 有一个很大的xml文档,你需要把同名标签里面的所有数字,和它们做一个算术运算,把它们返回回来,其余的不要碰。 也就是说,例如 <a> <b>100</b><b>200</b><b>300</b> </a> b 标签内的所有数字除以二。 Notepad++ 宏不能做算术,而 js 恐怕会在转换成数组后把剩下的内容破坏掉。还有哪些其他选择? xml 2 个回答 Voted becouse 2020-01-17T00:11:10Z2020-01-17T00:11:10Z 实际上,在文本手段的帮助下,这是不可能做到的。好吧,有一个非常糟糕的选择:存储数字及其一半,然后用另一个替换。 我提供了一个 python 脚本 输入文件(注意正确的 XML 包含根): <?xml version="1.0"?> <root> <a> <b>25</b> <b>300</b> </a> <a> <b>255</b> <b>200</b> </a> <b> <b>testing</b> <b>100</b> </b> </root> 图书馆连接 from xml.etree import ElementTree 测试整数或实数的函数 def is_digit(string): if string.isdigit(): return True else: try: float(string) return True except ValueError: return False 脚本本身 fileName = "input.xml" tree = ElementTree.parse(fileName) root = tree.getroot() for value in root.iter('b'): if is_digit(value.text): new_value = float(value.text) / 2 value.text = str(new_value) value.set('updated', 'yes') tree.write('output.xml') 结果 <root> <a> <b updated="yes">12.5</b> <b updated="yes">150.0</b> </a> <a> <b updated="yes">127.5</b> <b updated="yes">100.0</b> </a> <b> <b>testing</b> <b updated="yes">50.0</b> </b> </root> 如果您不需要标记更新的标签,则删除该行 value.set('updated', 'yes') Best Answer Sergey Tatarincev 2020-01-17T10:36:13Z2020-01-17T10:36:13Z 为了不迷失在评论中,我添加了一个新答案。您可以使用 xmlstarlet 执行此操作。对于您的文件 <?xml version="1.0"?> <root> <a> <b>25</b> <b>300</b> </a> <a> <b>255</b> <b>200</b> </a> <a> <b>testing</b> <b>100</b> </a> </root> 从命令行运行 xmlstarlet ed -u "//b" -x ".div 2" my.xml >my_new.xml 重点:对于输出中的非数字值,获取“NaN”(看测试用例)
实际上,在文本手段的帮助下,这是不可能做到的。好吧,有一个非常糟糕的选择:存储数字及其一半,然后用另一个替换。
我提供了一个 python 脚本
输入文件(注意正确的 XML 包含根):
图书馆连接
测试整数或实数的函数
脚本本身
结果
如果您不需要标记更新的标签,则删除该行
为了不迷失在评论中,我添加了一个新答案。您可以使用 xmlstarlet 执行此操作。对于您的文件
从命令行运行
重点:对于输出中的非数字值,获取“NaN”(看测试用例)