forked from mizutuu/jpgisgmlv4togml-converter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfgdschema.py
83 lines (65 loc) · 2.62 KB
/
fgdschema.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
from lxml import etree
from schema import Schema
class FgdSchema(Schema):
def __init__(self, schemafile):
super().__init__(schemafile)
def get_fgd_element_names(self):
names = []
node = self.findall("./xs:element")
for e in node:
if e.attrib.get("name") is not None:
names.append(e.attrib.get("name"))
names.remove("Dataset")
return names
def get_fgd_element_attributes(self, name):
attributes = []
elements = self.get_fgd_elements(name)
if elements is not None:
for v in elements:
attributes.append(v['name'])
return attributes
def get_fgd_element(self, name, tag):
elements = self.get_fgd_elements(name)
if elements is not None:
for element in elements:
if element['name'] == tag:
return element
return None
def get_fgd_elements(self, name):
node = self.find(".//xs:element[@name='" + name + "']")
# get the complexType in sequence elements
type = node.attrib.get("type")
if type is None:
return None
typename = etree.QName(self.replace_ns(type)).localname
return self.get_fgd_complexType_sequence(typename)
def get_fgd_complexType_sequence(self, name):
elements = []
# get the base complexType define, sequence element list.
node = self.find(".//xs:complexType[@name='" + name + "']" + "/xs:complexContent/xs:extension")
if node is not None and node.attrib.get("base") is not None:
typename = etree.QName(self.replace_ns(node.attrib.get("base"))).localname
elements.extend(self.get_fgd_complexType_sequence(typename))
# get the sequence element list.
node = self.find(".//xs:complexType[@name='" + name + "']" + "/xs:complexContent/xs:extension/xs:sequence")
if node is None:
return elements
for v in node:
if len(v.attrib) > 0:
elements.append(v.attrib)
return elements
if __name__ == '__main__':
xsdfile = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'FGD_GMLSchema.xsd')
with open(xsdfile) as f:
schema = FgdSchema(f)
element_names = schema.get_fgd_element_names()
print(element_names)
print(schema.get_fgd_element_attributes("WStrL"))
print(schema.get_fgd_element("WStrL", "loc"))
print(schema.get_fgd_elements("WStrL"))
# print all types.
for e in element_names:
elements = schema.get_fgd_elements(e)
for i in elements:
print(i['type'])