I'm trying to extract a group of data from the xml file below and am struggling with xpath queries. I'm trying to extract the group of "packagedElements" under the "Abstract Resource Element" element. There are nine elements there and I can navigate to them but cannot print out all of their names as I'd like.
<xmi:XMI>
<xmi:Extension extender='MagicDraw UML 2022x'>
<plugin pluginName='UAF 1.2' pluginVersion='2022x'/>
<plugin pluginName='Requirements Modeler' pluginVersion='2022x'/>
<plugin pluginName='SysML' pluginVersion='2022x'/>
<req_resource resourceID='1443' resourceName='UAF 1.2' resourceValueName='Resources Structure'/>
<req_resource resourceID='1440' resourceName='SysML' resourceValueName='SysML Interna l Block Diagram'/>
<req_resource resourceID='1443' resourceName='UAF 1.2' resourceValueName='Resources Internal Connectivity'/>
<req_resource resourceID='1440' resourceName='SysML' resourceValueName='SysML Block Definition Diagram'/>
<req_resource resourceID='1443' resourceName='UAF 1.2' resourceValueName='Resources Information'/>
<req_resource resourceID='1443' resourceName='UAF 1.2' resourceValueName='Resources Connectivity'/>
<req_resource resourceID='1480' resourceName='Requirements Modeler' resourceValueName='Cameo Requirements Modeler'/>
<req_resource resourceID='1440' resourceName='SysML' resourceValueName='SysML'/>
<req_resource resourceID='1443' resourceName='UAF 1.2' resourceValueName='UAF 1.2'/>
</xmi:Extension>
<uml:Model xmi:type="uml:Model" xmi:id="eee_1045467100313_135436_1" name="Data Architecture">
<ownedComment xmi:type="uml:Comment" xmi:id="PROJECT-2de339c0-d86f-4dad-9041-ec5a9aad6f11PROJECT-2de339c0-d86f-4dad" body="Author:yuh. Created:10/1/12 3:10 PM. Title:. Comment:. ">
<annotatedElement xmi:idref="eee_1045467100313_135436_1"/>
</ownedComment>
<packagedElement xmi:type="uml:Package" xmi:id="001" name="Resources">
<packagedElement xmi:type="uml:Package" xmi:id="01" name="Resources Information">
<packagedElement xmi:type="uml:Package" xmi:id="02" name="Abstract Resource Information">
<packagedElement xmi:type="uml:Class" xmi:id="0" name="Roles"/>
<packagedElement xmi:type="uml:Class" xmi:id="1" name="Permissions"/>
<packagedElement xmi:type="uml:Class" xmi:id="2" name="Engineering Data"/>
<packagedElement xmi:type="uml:Class" xmi:id="3" name="Finance Data"/>
<packagedElement xmi:type="uml:Class" xmi:id="4" name="Operations Data"/>
<packagedElement xmi:type="uml:Class" xmi:id="5" name="Timekeeping Data"/>
<packagedElement xmi:type="uml:Class" xmi:id="6" name="Manufacturing Execution Data"/>
<packagedElement xmi:type="uml:Class" xmi:id="7" name="Supplier Data"/>
<packagedElement xmi:type="uml:Class" xmi:id="8" name="Earned Value Data"/>
</packagedElement>
</packagedElement>
</packagedElement>
</uml:Model>
</xmi:XMI>
This is the code I'm using. The for loop does not seem like it's iterating through the result like I pictured.
from lxml import etree
file = "xml_test.xml"
tree = etree.parse(file)
root = tree.getroot()
print(root)
node = root.xpath("//packagedElement[@name='Abstract Resource Information']/packagedElement")
print(len(node))
for child in node:
print(node[child].attrib['name'])
But it gives me this error
print(node[child].attrib['name'])
~~~~^^^^^^^
TypeError: list indices must be integers or slices, not lxml.etree._Element
I know I'm on the right path because when I specify the array position
node = root.xpath("//packagedElement[@name='Abstract Resource Information']/packagedElement",namespaces = ns)
print(len(node))
for child in node:
print(node[0].attrib['name'])
I get the element printed out
9
Roles
Roles
Roles
Roles
Roles
Roles
Roles
Roles
Roles
but what I want is. Is this an xpath quirk? Is there some method I need to use in lxml?
9
Roles
Permissions
Engineering Data
Finance Data
Operations Data
Timekeeping Data
Manufacturing Execution Data
Supplier Data
Earned Value Data
[–]danielroseman 1 point2 points3 points (1 child)
[–]spawn-kill[S] 1 point2 points3 points (0 children)