0

Section of my XML document

<?xml version="1.0"?>
<orderDocument xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://plmpack.com/stackbuilder/StackBuilderXMLExport.xsd">
  <author>cmj</author>
  <date>2019-02-14T10:45:48.4872033+01:00</date>
  <unit>mm|kg</unit>
  <orderType>
    <orderNumber>Analysis0</orderNumber>
    <loadSpace>
  <id>1</id>
  <name>Pallet0</name>
  <length>1200</length>
  <width>800</width>
  <maxLoadHeight>1500</maxLoadHeight>
  <maxLoadWeight>0</maxLoadWeight>
  <baseHeight>144</baseHeight>
  <maxLengthOverhang>0</maxLengthOverhang>
  <maxWidthOverhang>0</maxWidthOverhang>
</loadSpace>
<item>
  <id>1</id>
  <name>paper0</name>
  <length>320</length>
  <width>260</width>
  <height>120</height>
  <weight>5</weight>
  <maxWeightOnTop>0</maxWeightOnTop>
  <permittedOrientations>001</permittedOrientations>
</item>
<orderLine>
  <itemId>1</itemId>
  <quantity>110</quantity>
</orderLine>
<load>
  <loadSpaceId>1</loadSpaceId>
  <statistics>
    <loadVolume>1098240000</loadVolume>
    <volumeUtilization>84.365781710914447</volumeUtilization>
    <loadWeight>550</loadWeight>
    <weightUtilization>INF</weightUtilization>
    <loadHeight>1320</loadHeight>
    <cOfG>
      <x>0</x>
      <y>0</y>
      <z>0</z>
    </cOfG>
  </statistics>
  <placement>
    <itemId>1</itemId>
    <x>20</x>
    <y>10</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
  </placement>
  <placement>
    <itemId>1</itemId>
    <x>20</x>
    <y>270</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
  </placement>
  <placement>
    <itemId>1</itemId>
    <x>20</x>
    <y>530</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
  </placement>
  <placement>
    <itemId>1</itemId>
    <x>340</x>
    <y>10</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
   </placement>
  </load>     
 </orderType>      
</orderDocument>     

The code i got so far

import os
import xml.etree.ElementTree as ET

from xml.etree.ElementTree import ElementTree

base_path = os.path.dirname(os.path.realpath(__file__))

xml_file = os.path.join(base_path, "first_try_palletizing.xml")

tree = ET.parse(xml_file)

root = tree.getroot()

The program is for a palletizing robot arm. The XML data is from a program that calculates the best possible way to stack objects. What i need is to extract the "placement" data (x,y,z,L,W), so i can feed it to the robot program. I'm completely new in Python, so assume i dont know anything at all.

i've tried the code below, but i cant get deeper than: (orderNumber, loadSpace, item, orderLine, load).

for child in root:
    for element in child:
        print(element)

Sorry its a bit messy, but it is my first time using stackoverflow.

1 Answers1

0

The code below is bypassing the namespaces and looking for the 'placement' element

import xml.etree.ElementTree as ET
from StringIO import StringIO

xml = '''<?xml version="1.0"?>
<orderDocument xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://plmpack.com/stackbuilder/StackBuilderXMLExport.xsd">
  <author>cmj</author>
  <date>2019-02-14T10:45:48.4872033+01:00</date>
  <unit>mm|kg</unit>
  <orderType>
    <orderNumber>Analysis0</orderNumber>
    <loadSpace>
  <id>1</id>
  <name>Pallet0</name>
  <length>1200</length>
  <width>800</width>
  <maxLoadHeight>1500</maxLoadHeight>
  <maxLoadWeight>0</maxLoadWeight>
  <baseHeight>144</baseHeight>
  <maxLengthOverhang>0</maxLengthOverhang>
  <maxWidthOverhang>0</maxWidthOverhang>
</loadSpace>
<item>
  <id>1</id>
  <name>paper0</name>
  <length>320</length>
  <width>260</width>
  <height>120</height>
  <weight>5</weight>
  <maxWeightOnTop>0</maxWeightOnTop>
  <permittedOrientations>001</permittedOrientations>
</item>
<orderLine>
  <itemId>1</itemId>
  <quantity>110</quantity>
</orderLine>
<load>
  <loadSpaceId>1</loadSpaceId>
  <statistics>
    <loadVolume>1098240000</loadVolume>
    <volumeUtilization>84.365781710914447</volumeUtilization>
    <loadWeight>550</loadWeight>
    <weightUtilization>INF</weightUtilization>
    <loadHeight>1320</loadHeight>
    <cOfG>
      <x>0</x>
      <y>0</y>
      <z>0</z>
    </cOfG>
  </statistics>
  <placement>
    <itemId>1</itemId>
    <x>20</x>
    <y>10</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
  </placement>
  <placement>
    <itemId>1</itemId>
    <x>20</x>
    <y>270</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
  </placement>
  <placement>
    <itemId>1</itemId>
    <x>20</x>
    <y>530</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
  </placement>
  <placement>
    <itemId>1</itemId>
    <x>340</x>
    <y>10</y>
    <z>144</z>
    <L>XP</L>
    <W>YP</W>
   </placement>
  </load>     
 </orderType>      
</orderDocument> '''

placements_data = []

it = ET.iterparse(StringIO(xml))
for _, el in it:
    if '}' in el.tag:
        el.tag = el.tag.split('}', 1)[1]  # strip all namespaces
root = it.root
placements = root.findall('.//placement')
for idx, placement in enumerate(placements):
    print('placement # {}'.format(idx))
    for i in range(1, 6):
        child = placement.getchildren()[i]
        print('\t{} - {}'.format(child.tag, child.text))

Output

placement # 0
    x - 20
    y - 10
    z - 144
    L - XP
    W - YP
placement # 1
    x - 20
    y - 270
    z - 144
    L - XP
    W - YP
placement # 2
    x - 20
    y - 530
    z - 144
    L - XP
    W - YP
placement # 3
    x - 340
    y - 10
    z - 144
    L - XP
    W - YP
balderman
  • 22,927
  • 7
  • 34
  • 52
  • To handle default namespace use: `.findall('.//#:placement', namspaces={'#': "http://plmpack.com/stackbuilder/StackBuilderXMLExport.xsd"})` – stovfl Mar 07 '19 at 15:41
  • WOW. This is exactly what i needed! Thanks a lot. I have up-voted too, but i guess it doesn't count because i'm new to this site. – Casper Møller Jensen Mar 08 '19 at 08:03