2016-12-19 2 views
2

Он работает с IronPython 2.7 в Dynamo. Мне нужно получить значение из конкретной заметки в очень большом xml. Я сделал пример xml, так что вам лучше понять проблему. Так что мне нужно получить значение «lvl», но только в примечании «to».python 2.7 xml - получить значение из определенной заметки ниже заметки

В настоящее время я получаю сообщение об ошибке:

TypeError: list objects are unhashable"

для линии:

list.extend(elem.findall(match)) 

Что я делаю неправильно? Есть ли лучший/простой способ сделать это?

Вот пример XML:

<?xml version="1.0" encoding="UTF-8"?> 
<note> 
    <note2> 
     <yolo> 
      <to> 
       <type> 
        <game> 
         <name>Jani</name> 
         <lvl>111111</lvl> 
         <fun>2222222</fun> 
        </game> 
       </type> 
      </to> 
      <mo> 
       <type> 
        <game> 
         <name>Bani</name> 
         <lvl>3333333</lvl> 
         <fun>44444444</fun> 
        </game> 
       </type> 
      </mo> 
     </yolo> 
    </note2> 
</note> 

И вот мой код:

import clr 
import sys 

clr.AddReference('ProtoGeometry') 
from Autodesk.DesignScript.Geometry import * 
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib") 
import xml.etree.ElementTree as ET 

xml="note.xml" 

xpathstr=".//yolo" 
match ="lvl" 

list=[] 

tree = ET.parse(xml) 
root = tree.getroot() 

specific = root.findall(xpathstr) 

for elem in specific: 
    list.extend(elem.findall(match)) 

print tree, root, specific, list 

ответ

1

Если вам нужно получить значение «лвл», но только в записке «к» вы можете сделать это в одном из XPath:

import xml.etree.ElementTree as ET 
xml="note.xml" 
xpathstr=".//to//lvl" 
tree = ET.parse(xml) 
root = tree.getroot() 
specific = root.findall(xpathstr) 
list=[] 
for elem in specific: 
    list.append(elem.text) 
print (list) 

дает:

['111111'] 

Если вы знаете, что есть элементы «type» и «game», содержащие «lvl», вы можете использовать xpath «.//to/type/game/lvl» или если элемент «to» должен быть содержащийся в «yolo», затем используйте «.//yolo/to/type/game/lvl»

И вы, вероятно, захотите использовать list.append вместо list.extend, но, возможно, нет, я не знаю, остальной части вашего кода.

+0

Hi thx за вашу помощь! Теперь я знаю, как правильно передать xpath. Задача решена. – Yuli

+0

Вы можете принять ответ, используя кнопки слева от ответа, если он ответил на ваш вопрос, если хотите –

Смежные вопросы