Advertisement
HellFinger

XMLTODDL

Jun 23rd, 2020
1,208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.60 KB | None | 0 0
  1. from lxml import etree
  2.  
  3.  
  4.  
  5.  
  6. def XML2DDL(source: str):
  7.     tree = etree.parse(source)
  8.    
  9.    
  10.     ddl = ""
  11.    
  12.    
  13.    
  14.    
  15.     data_arr = []
  16.     item_dict = {}
  17.     prm_k = []
  18.     frg_k = {}
  19.     frg_ref = {}
  20.    
  21.     spec = {}
  22.    
  23.     ctr = -1
  24.  
  25.    
  26.    
  27.     for p in tree.iter():
  28.         if p.tag == "tables":
  29.             continue
  30.        
  31.         if(p.tag == "columns" or p.tag == "rows"):
  32.             continue
  33.            
  34.         if(p.tag == "table"):
  35.             spec["table_name"] = p.attrib["name"]
  36.             continue
  37.            
  38.         if (p.tag == "constraints"):
  39.             continue
  40.            
  41.         if (p.tag == "primary-key"):
  42.             for k in p.getchildren():
  43.                 if k.tag == "column-ref":
  44.                     prm_k.append(k.attrib["name"])
  45.             continue
  46.        
  47.         if (p.tag == "foreign-key"):
  48.             frg_k[(p.attrib['name'], p.attrib['references'])] = []
  49.             frg_ref[(p.attrib['name'], p.attrib['references'])] = []
  50.             for k in p.getchildren():
  51.                 if k.tag == "column-ref":
  52.                     frg_k[(p.attrib['name'], p.attrib['references'])].append(k.attrib["name"])
  53.                 if k.tag == "referenced-column":
  54.                     frg_ref[(p.attrib['name'], p.attrib['references'])].append(k.attrib['name'])
  55.             continue    
  56.        
  57.         if p.tag == "column-ref":
  58.             continue
  59.         if p.tag == "referenced-column":
  60.             continue
  61.            
  62.         if(p.tag == "column"):
  63.             spec[p.attrib["name"]] = p.attrib["type"]
  64.             continue
  65.        
  66.         if (p.tag == "row"):
  67.             if (len(item_dict)):
  68.                 data_arr.append(item_dict)
  69.             item_dict = {}
  70.             continue
  71.        
  72.         item_dict[p.tag] = str(p.text)
  73.     data_arr.append(item_dict)
  74.    
  75.    
  76.     ans  = "DROP TABLE IF EXISTS " + spec["table_name"] + ';' + '\n'
  77.    
  78.    
  79.     if frg_k and frg_ref:
  80.         final_str = ''
  81.         for i in frg_k:
  82.             frg_str = ' FOREIGN KEY ('
  83.             for k in frg_k[i]:
  84.                 frg_str += k
  85.                 frg_str += ','
  86.             frg_str = frg_str[:len(frg_str) - 1] + ')' + " REFERENCES " + i[1] + '('
  87.            
  88.             for k in frg_ref[i]:
  89.                 frg_str += k
  90.                 frg_str += ','
  91.             frg_str = frg_str[:len(frg_str) - 1] + '), '
  92.             final_str += frg_str
  93.         final_str = final_str[:len(final_str)-2]
  94.     else:
  95.         final_str = ''
  96.    
  97.    
  98.     ans  +=  "CREATE TABLE " + spec["table_name"] + " ("
  99.     for item in spec:
  100.         if(item != "table_name"):
  101.             ans += (item + " " + spec[item] + ", ")
  102.     if prm_k:
  103.         primk = ", PRIMARY KEY("
  104.         for j in prm_k:
  105.             primk += j
  106.             primk += ','
  107.         primk = primk[:len(primk)-1] + ')'
  108.            
  109.     else:
  110.         primk = ''
  111.            
  112.     ans = ans[:len(ans) - 2] + primk + final_str + ')'';' + '\n'
  113.    
  114.    
  115.     temp = "("
  116.     for i in spec:
  117.         if(i != "table_name"):
  118.             temp += i + ", "
  119.     temp = temp[:len(temp) - 2] + ")"
  120.    
  121.    
  122.     for row in data_arr:
  123.         ans += "INSERT INTO " + spec["table_name"]  + temp + " values"
  124.         values  = "("
  125.         for i in row:
  126.             if(spec[i] == 'VARCHAR(50)'):
  127.                 values += '"'+ row[i] +'"' + ", "
  128.                 continue
  129.             values += row[i] + ", "
  130.  
  131.            
  132.         values = values[:len(values) - 2] + ')'
  133.         ans += values + ';' + '\n'
  134.     return ans
  135.  
  136.  
  137. print(XML2DDL(r"C:\Users\PCAsusrog\Downloads\file8.xml"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement