def _parse_xml(base_elem): """ Parse the xml of an <element> tag, extracting the ProjectObject attributes. Inputs: base_elem (ET.Element) - An Element with tag "element" and appropriate sub-elements. Return: tuple (id, pose, category, bounds, symmetry, score, evaluated) ProjectObject attributes (see constructor for details). Exceptions: ValueError - If base_elem is not <element> or if none of its children is <id>. """ # verify base_elem tag is 'element' if base_elem.tag != "element": raise ValueError('Expected tag to be "element"') # defaults proxy = ProjectObject(1) category = proxy.category pose = proxy.pose symmetry = proxy.symmetry score = proxy.score evaluated = proxy.evaluated for elem in base_elem: if elem.tag == "id": id = elem.text elif elem.tag == "pose": pose = Pose3.from_xml(elem) elif elem.tag == "category": category = elem.text elif (elem.tag == "bounds"): # Note: Boxe3d.from_xml expects tag to be 'box3d' elem_temp = deepcopy(elem) elem_temp.tag = "box3d" bounds = Box3d.from_xml(elem_temp) elif elem.tag == "symmetry": symmetry = ObjectSymmetry.from_xml(elem) elif elem.tag == "detectionScore": score = float(elem.text) elif elem.tag == "evaluated": evaluated = bool(elem.text) if id is None: raise ValueError("XML is missing required <id> tag.") return (id, pose, category, bounds, symmetry, score, evaluated)
def test_xml(self): """Test converting to and from xml.""" s = b"<symmetry><x>twoFold</x><y>cylindrical</y><z>twoFold</z></symmetry>" expected_sym = ObjectSymmetry(SymmetryType.twoFold, SymmetryType.cylindrical, SymmetryType.twoFold) # xml -> object xml = ET.fromstring(s) sym = ObjectSymmetry.from_xml(xml) print("sym=", sym) print("expected=", expected_sym) self.assertEqual(sym, expected_sym) # object -> xml xml = sym.to_xml() self.assertEqual(ET.tostring(xml), s)