2016-10-10 103 views
0

感谢您抽出时间与这个。 我有一个名为selectionset的元素的XML文件。这个想法是采取这个元素,并修改一些子元素的属性和尾巴,这一部分我已经完成了。 ,我让背阴的事情就是为什么当我尝试新的子元素添加到原来的(称为selectionsets)其唯一推过去就行了inplist问题:python xml append for循环中的元素

import xml.etree.ElementTree as etree 
from xml.etree.ElementTree import * 
from xml.etree.ElementTree import ElementTree 
tree=ElementTree() 
tree.parse('STRUCTURAL.xml') 
root = tree.getroot() 
col=tree.find('selectionsets/selectionset') 
#find the value needed 
val=tree.findtext('selectionsets/selectionset/findspec/conditions/condition/value/data') 
setname=col.attrib['name'] 
listnames=val + " 6" 
inplist=["D","E","F","G","H"] 
entry=3 
catcher=[] 
ss=root.find('selectionsets') 
outxml=ss 
for i in range(len(inplist)): 
    str(val) 
    col.set('name',(setname +" "+ inplist[i])) 
    col.find('findspec/conditions/condition/value/data').text=str(inplist[i]+val[1:3]) 
    #print (etree.tostring(col)) #everything working well til this point 
    timper=col.find('selectionset') 
    root[0].append(col) 
    # new=etree.SubElement(outxml,timper) 
#you need to create a tree with element tree before creating the xml file 

itree=etree.ElementTree(outxml) 
itree.write('Selection Sets.xml') 
print (etree.tostring(outxml)) 

# print (Test_file.selectionset()) 


#Initial xml 
<?xml version="1.0" encoding="UTF-8" ?> 

<exchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://download.autodesk.com/us/navisworks/schemas/nw-exchange-12.0.xsd" units="ft" filename="STRUCTURAL.nwc" filepath="C:\Users\Ricardo\Desktop\Comun\Taller 3"> 
    <selectionsets> 
    <selectionset name="Column Location" guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8"> 
     <findspec mode="all" disjoint="0"> 
     <conditions> 
      <condition test="contains" flags="10"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">C-A </data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    </selectionsets> 
</exchange> 

#----Current Output 
<selectionsets> 
    <selectionset guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8" name="Column Location H"> 
     <findspec disjoint="0" mode="all"> 
     <conditions> 
      <condition flags="10" test="contains"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">H-A</data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    <selectionset guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8" name="Column Location H"> 
     <findspec disjoint="0" mode="all"> 
     <conditions> 
      <condition flags="10" test="contains"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">H-A</data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    <selectionset guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8" name="Column Location H"> 
     <findspec disjoint="0" mode="all"> 
     <conditions> 
      <condition flags="10" test="contains"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">H-A</data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    <selectionset guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8" name="Column Location H"> 
     <findspec disjoint="0" mode="all"> 
     <conditions> 
      <condition flags="10" test="contains"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">H-A</data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    <selectionset guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8" name="Column Location H"> 
     <findspec disjoint="0" mode="all"> 
     <conditions> 
      <condition flags="10" test="contains"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">H-A</data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    <selectionset guid="565f5345-de06-4f5b-aa0f-1ae751c98ea8" name="Column Location H"> 
     <findspec disjoint="0" mode="all"> 
     <conditions> 
      <condition flags="10" test="contains"> 
      <category> 
       <name internal="LcRevitData_Element">Element</name> 
      </category> 
      <property> 
       <name internal="lcldrevit_parameter_-1002563">Column Location Mark</name> 
      </property> 
      <value> 
       <data type="wstring">H-A</data> 
      </value> 
      </condition> 
     </conditions> 
     <locator>/</locator> 
     </findspec> 
    </selectionset> 
    </selectionsets> 
+0

假设你正在使用xml.etree.ElementTree,查找方法只查找在指定的路径的第一个元素。因此,每次迭代都会找到相同的元素,然后修改它,然后将其附加到根。您可能需要迭代元素并增加“inplist”。但是,这是一个假设。能够看到原始的XML和完整的代码进行处理会很好。 –

+0

感谢您的回复,这是有道理的,但如果我使用循环内的打印它似乎是工作我得到了渴望的结果我新的XML处理,所以即时我确定我犯了一些错误。 – RicardoZepeda

回答

0

这里是我已经能够把一起,看起来它会做你想要的。以下是主要区别:(1)这将迭代多个选择集项目(如果最终得到多个选项集),(2)它在修改值之前创建元素的深度拷贝(我认为您总是修改原始“col”),(3)它将新选择集附加到选择集标记而不是根。

这里的deepcopy documentation

import xml.etree.ElementTree as etree 
import copy 

tree=etree.ElementTree() 
tree.parse('test.xml') 
root = tree.getroot() 
inplist=["D","E","F","G","H"] 

for selectionset in tree.findall('selectionsets/selectionset'): 
    for i in inplist: 
     col = copy.deepcopy(selectionset) 
     col.set('name', '%s %s' % (col.attrib['name'], i)) 
     data = col.find('findspec/conditions/condition/value/data') 
     data.text = '%s%s' % (i, data.text[1:3]) 
     root.find('selectionsets').append(col) 

itree = etree.ElementTree(root) 
itree.write('Selection Sets.xml') 
+0

像冠军一样工作!感谢人们即时研究你的代码! – RicardoZepeda

+0

很高兴听到! @RicardoZepeda,如果这是你正在寻找和它的作品,你能接受它作为一个答案,以便我可以建立我的代表了一下?它可以让我在这个网站上多一点帮助。 –