更改特定子元素中的值

2024-04-19 08:42:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我的剧本有些问题。你知道吗

  1. 首先,我要确保用户提供了正确的名称。例如,如果我要写“Name”,它就不应该与xml中的任何内容匹配。如果我要写“NameY”,它应该与给定的名称匹配,而不是其他任何东西(例如“NameX不应该匹配”)。我试着用wordboundry,但并没有像我想的那样有用。

  2. 当我尝试更改NameY中的值时,脚本会更改所有值(甚至NameX)。我相信这是因为它不能把“名字”分开?

我正在使用argparse,代码在另一个函数中。你知道吗

  • 你知道吗参数名称=“要查找的名称”
  • 你知道吗args.dirname=“文件位置”
  • 你知道吗参数值“我要更改为的值”

wordboundry = re.compile(r'(<NAME>(%s\b)<\/NAME>)' % args.name)

getName = ("{0}ROOTS/{0}ROOT/{0}ELEM/{0}SPEC/[{0}NAME]")
getDigit = ("{0}ROOTS/{0}ROOT/{0}ELEM/{0}SPEC/{0}DP/{0}NVP/[{0}CHECK]/[{0}DIGIT]")


for fileName in glob.glob(args.dirname):
    print fileName
    with open(fileName,"r") as file:
        my_files_content = file.read()

    if args.name in my_files_content: #instead of using args.name i was trying to use if re.search(wordboundry, my_files_content):
        print "Parameter exist in this file\n"
        tree = tree = ElementTree.ElementTree()
        tree.parse(fileName)
        ElementTree.register_namespace("", "http://something.com")
        namespace = "{http://something.com}"

        for names in tree.findall(getName.format(namespace)):
            mathcName = names.find('{http://something.com}NAME').text
            if mathcName == **args.paramName**:
                for digits in tree.findall(getDigit.format(namespace)):
                    digitNumber = digits.find('{http://something.com}DIGIT').text
                    convertToString = ' '.join([str(mystring) for mystring in args.value]) #Convert to string

                    digits.find('{http://something.com}DIGIT').text = convertToString #This allows the script to changes the digit in the xml file
                    tree.write("test.xml", encoding='utf-8', xml_declaration=True)
                    else: print"NO MATCHES\n"
            else:
                print "i am not here"
    else:
        "Parameter does not exist in this file\n"

我的XML

<?xml version="1.0" encoding="utf-8"?>
<TOP xmlns="http://something.com">
  <ROOTS>
    <ROOT>
         <ELEM>
            <SPEC>
               <NAME>NameX</NAME>
               <DP>
                  <NVP>
                     <CHECK>NameX_1</CHECK>
                     <DIGIT>3</DIGIT>
                  </NVP>
                  <NVP>
                     <CHECK>NameX_2</CHECK>
                     <DIGIT>20</DIGIT>
                  </NVP>
               </DP>
            </SPEC>
            <SPEC>
               <NAME>NameY</NAME>
               <DP>
                  <NVP>
                     <CHECK>NameY</CHECK>
                     <DIGIT>7</DIGIT>
                  </NVP>
               </DP>
            </SPEC>
         </ELEM>
    </ROOT>
  </ROOTS>
</TOP>

编辑通过将“不是无”改为“==参数名称““


Tags: namein名称comtreehttpcheckargs