Skip to content

Commit

Permalink
Merge pull request #37 from wri/master
Browse files Browse the repository at this point in the history
Find best suited element, in case multiple elements with the same path exist
  • Loading branch information
Thomas Maschler authored Apr 8, 2017
2 parents 627937e + 2dfd018 commit d02ae50
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 31 deletions.
76 changes: 48 additions & 28 deletions arcpy_metadata/metadata_constructors.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,35 +165,55 @@ def _require_tree_elements(self):
e_tree = self.path.split('/')
root = self.parent.elements.getroot()

done = False
while not done:
d = {}
i = 0
d[i] = root
for e in e_tree:
# remove index for multi items, looks goofy. Is there a better way?
if "[" in e:
p = e.index('[')
e_name = e[:p]
e_attrib = e[p:][1:-1].split('][')
else:
e_name = e
e_attrib = []
i += 1
d[i] = d[i-1].find(e)
if d[i] is None:
child = ET.Element(e_name)
for attrib in e_attrib:
if attrib[0] == "@":
kv = attrib.split('=')
key = kv[0][1:]
value = kv[1][1:-1]
child.set(key, value)
d[i-1].append(child)
elements = root.findall(self.path)

# if there is already exactly one element, take this one
if len(elements) == 1:
self.element = elements[0]
return

# if there is more than one, take the first one with a value, attribut or children.
# if all are empty, just take the last one
elif len(elements) > 1:
for element in elements:
if element.text.strip() != '' or element.attrib is not None or len(element.getchildren()) > 0:
break
elif i == len(e_tree):
self.element = d[i]
done = True
self.element = element
return

# otherwise build the tree
else:

done = False
while not done:
d = {}
i = 0
d[i] = root

for e in e_tree:
# remove index for multi items, looks goofy. Is there a better way?
if "[" in e:
p = e.index('[')
e_name = e[:p]
e_attrib = e[p:][1:-1].split('][')
else:
e_name = e
e_attrib = []
i += 1
d[i] = d[i-1].find(e)
if d[i] is None:
child = ET.Element(e_name)
for attrib in e_attrib:
if attrib[0] == "@":
kv = attrib.split('=')
key = kv[0][1:]
value = kv[1][1:-1]
child.set(key, value)
d[i-1].append(child)
break
elif i == len(e_tree):
self.element = d[i]
done = True


class MetadataValueListConstructor(MetadataItemConstructor):
Expand Down
7 changes: 4 additions & 3 deletions tests/test_metadata_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import unittest
import os
import sys
import shutil
import distutils
from distutils import dir_util
import tempfile
Expand All @@ -21,8 +20,6 @@
from test_elements import test_elements




class TestMetadataWriteRead(unittest.TestCase):
"""
To start with, let's just get a simple test in that tests the code from the perspective of how someone might use it.
Expand Down Expand Up @@ -204,6 +201,10 @@ def test_raster_file(self):
self._read_metadata(os.path.join(self.temp_data_folder, r"simple_raster.tif"))






if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TestMetadataWriteRead)
unittest.TextTestRunner(verbosity=2).run(suite)
Expand Down

0 comments on commit d02ae50

Please sign in to comment.