2015-04-22 2 views
0

Я пытаюсь написать скрипт python для создания объекта из XML-документа, но у меня возникли проблемы с пониманием того, как работают пути. Вот пример из Docs XML:Пути деревьев элемента Python

<args format="1.0"> 
<shaderType> 
    <tag value="pattern"/> 
</shaderType> 
<help> 
    Computes the facing ratio of the geometry : a simple dot product between 
    the camera vector and the surface normal. 
</help> 
<page name="Parameters" open="True"> 
    <param name="faceForward" 
     label="Face Forward" 
     type="int" 
     default="1" 
     widget="checkbox"> 
     <tags> 
      <tag value="__noconnection"/> 
     </tags> 
     <help>The facing ratio can be negative if the normal is pointing 
     away from the camera. This will flip the normal to always give a 
     positive result.</help> 
    </param> 
    <param name="invert" 
     label="Invert" 
     type="int" 
     default="0" 
     widget="checkbox"> 
     <tags> 
      <tag value="__noconnection"/> 
     </tags> 
     <help>Inverts the facing ratio : black becomes white and 
     vice-versa.</help> 
    </param> 
    <param name="gamma" 
     label="Gamma" 
     type="float" 
     default="1.0" 
     widget="default"> 
     <tags> 
      <tag value="float"/> 
     </tags> 
     <help>A simple gamma function to shape the facing ratio. A value of 1.0 is 
     neutral</help> 
    </param> 
    <param name="bumpNormal" 
     label="Bump Normal" 
     type="normal" 
     widget="default"> 
     <tags> 
      <tag value="normal"/> 
     </tags> 
     <help>If the surface is bump-mapped, input the bump normal here. If 
     not connected, the node will use ths shading normal.</help> 
    </param> 
</page> 

<output name="resultF"> 
    <tags> 
     <tag value ="float"/> 
    </tags> 
</output> 

<rfmdata nodeid="1053349" 
     classification="rendernode/RenderMan/pattern"/> 

Допустим, я хочу, чтобы получить заявление справки для самого объекта. Я использовал это:

nodeText = tree.findtext('.//args/help') 
    print nodeText 

Это, однако, возвращает None. Является ли путь неправильным?

ответ

0

Использование

nodeHelp = tree.xpath("/args/help")[0] 
print(nodeHelp.text) 
+0

Спасибо за вашу помощь, но я дать что попробовать, но он по-прежнему возвращаются Никто. Я знаю, что документы читаются правильно, потому что, когда я нахожусь, я получаю все элементы помощи. – jspada

+0

@jspada Изменен мой ответ. –

+0

Привет, Tichodroma, Спасибо за помощь, но это не сработало, потому что xpath не поддерживался деревом элементов. Я взял то, что вы сделали, и использовал его для решения проблемы. Я знаю, что это всегда будет первый элемент, поэтому я нашел все и выбрал первый элемент. – jspada

0

Можете ли вы подтвердить, что «дерево» объект, который вы имеете в виду это корневой элемент типа элемента и не является экземпляром типа ElementTree?

Если это тип ElementTree, используйте метод getroot() для получения корневого элемента.

В основном, в следующем фрагменте кода вы должны получить корневой элемент:

from xml.etree.ElementTree import parse 
args = parse('/path/to/file').getroot() 

Затем вы можете использовать следующие для получения каждого из элементов «помощи»:

args.findall(".//help") 

Если вы хотите только элемент «помощи» под корневым объектом:

args.find("help") 

Если вы хотите, чтобы текст в элементе:

print args.find("help").text 

PS: XML фрагмент кода в вашем вопросе выше отсутствует согласование закрывающий тег для «арг»

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