Advertisement
HellFinger

XMLTODDL MULTITABLE

Jun 23rd, 2020
1,124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.39 KB | None | 0 0
  1. from lxml import etree
  2. import re
  3.  
  4.  
  5.  
  6. def XML2DDL(source: str):
  7.     tbl = etree.parse(source)
  8.    
  9.    
  10.     ddl = ""
  11.    
  12.     ref = tbl.getroot().findall("table")
  13.    
  14.     for tree in ref:
  15.        
  16.         data_arr = []
  17.         item_dict = {}
  18.         prm_k = []
  19.         frg_k = {}
  20.         frg_ref = {}
  21.  
  22.         spec = {}
  23.  
  24.         ctr = -1
  25.  
  26.  
  27.  
  28.         for p in tree.iter():
  29.             if p.tag == "tables":
  30.                 continue
  31.  
  32.             if(p.tag == "columns" or p.tag == "rows"):
  33.                 continue
  34.  
  35.             if(p.tag == "table"):
  36.                 spec["table_name"] = p.attrib["name"]
  37.                 continue
  38.  
  39.             if (p.tag == "constraints"):
  40.                 continue
  41.  
  42.             if (p.tag == "primary-key"):
  43.                 for k in p.getchildren():
  44.                     if k.tag == "column-ref":
  45.                         prm_k.append(k.attrib["name"])
  46.                 continue
  47.  
  48.             if (p.tag == "foreign-key"):
  49.                 frg_k[(p.attrib['name'], p.attrib['references'])] = []
  50.                 frg_ref[(p.attrib['name'], p.attrib['references'])] = []
  51.                 for k in p.getchildren():
  52.                     if k.tag == "column-ref":
  53.                         frg_k[(p.attrib['name'], p.attrib['references'])].append(k.attrib["name"])
  54.                     if k.tag == "referenced-column":
  55.                         frg_ref[(p.attrib['name'], p.attrib['references'])].append(k.attrib['name'])
  56.                 continue    
  57.  
  58.             if p.tag == "column-ref":
  59.                 continue
  60.             if p.tag == "referenced-column":
  61.                 continue
  62.  
  63.             if(p.tag == "column"):
  64.                 spec[p.attrib["name"]] = p.attrib["type"]
  65.                 continue
  66.  
  67.             if (p.tag == "row"):
  68.                 if (len(item_dict)):
  69.                     data_arr.append(item_dict)
  70.                 item_dict = {}
  71.                 continue
  72.  
  73.             item_dict[p.tag] = str(p.text)
  74.         data_arr.append(item_dict)
  75.  
  76.  
  77.         ans  = "DROP TABLE IF EXISTS " + spec["table_name"] + ';' + '\n'
  78.  
  79.  
  80.         if frg_k and frg_ref:
  81.             final_str = ''
  82.             for i in frg_k:
  83.                 frg_str = ' FOREIGN KEY ('
  84.                 for k in frg_k[i]:
  85.                     frg_str += k
  86.                     frg_str += ','
  87.                 frg_str = frg_str[:len(frg_str) - 1] + ')' + " REFERENCES " + i[1] + '('
  88.  
  89.                 for k in frg_ref[i]:
  90.                     frg_str += k
  91.                     frg_str += ','
  92.                 frg_str = frg_str[:len(frg_str) - 1] + '), '
  93.                 final_str += frg_str
  94.             final_str = final_str[:len(final_str)-2]
  95.         else:
  96.             final_str = ''
  97.  
  98.  
  99.         ans  +=  "CREATE TABLE " + spec["table_name"] + " ("
  100.         for item in spec:
  101.             if(item != "table_name"):
  102.                 ans += (item + " " + spec[item] + ", ")
  103.         if prm_k:
  104.             primk = ", PRIMARY KEY("
  105.             for j in prm_k:
  106.                 primk += j
  107.                 primk += ','
  108.             primk = primk[:len(primk)-1] + ')'
  109.  
  110.         else:
  111.             primk = ''
  112.  
  113.         ans = ans[:len(ans) - 2] + primk + final_str + ')'';' + '\n'
  114.  
  115.  
  116.         temp = "("
  117.         for i in spec:
  118.             if(i != "table_name"):
  119.                 temp += i + ", "
  120.         temp = temp[:len(temp) - 2] + ")"
  121.  
  122.  
  123.         for row in data_arr:
  124.             ans += "INSERT INTO " + spec["table_name"]  + temp + " values"
  125.             values  = "("
  126.             for i in row:
  127.                 if(re.findall('[VARCHAR]+', spec[i])):
  128.                     values += '"'+ row[i] +'"' + ", "
  129.                     continue
  130.                 values += row[i] + ", "
  131.  
  132.  
  133.             values = values[:len(values) - 2] + ')'
  134.             ans += values + ';' + '\n'
  135.            
  136.         ddl = ddl + ans + '\n' + '\n'
  137.            
  138.     return ddl
  139.  
  140.  
  141. print(XML2DDL(r"C:\Users\PCAsusrog\Downloads\file9.xml"))
  142.  
  143.  
  144.    
  145.    
  146.    
  147.     data_arr = []
  148.     item_dict = {}
  149.     prm_k = []
  150.     frg_k = {}
  151.     frg_ref = {}
  152.    
  153.     spec = {}
  154.    
  155.     ctr = -1
  156.  
  157.    
  158.    
  159.     for p in tree.iter():
  160.         if p.tag == "tables":
  161.             continue
  162.        
  163.         if(p.tag == "columns" or p.tag == "rows"):
  164.             continue
  165.            
  166.         if(p.tag == "table"):
  167.             spec["table_name"] = p.attrib["name"]
  168.             continue
  169.            
  170.         if (p.tag == "constraints"):
  171.             continue
  172.            
  173.         if (p.tag == "primary-key"):
  174.             for k in p.getchildren():
  175.                 if k.tag == "column-ref":
  176.                     prm_k.append(k.attrib["name"])
  177.             continue
  178.        
  179.         if (p.tag == "foreign-key"):
  180.             frg_k[(p.attrib['name'], p.attrib['references'])] = []
  181.             frg_ref[(p.attrib['name'], p.attrib['references'])] = []
  182.             for k in p.getchildren():
  183.                 if k.tag == "column-ref":
  184.                     frg_k[(p.attrib['name'], p.attrib['references'])].append(k.attrib["name"])
  185.                 if k.tag == "referenced-column":
  186.                     frg_ref[(p.attrib['name'], p.attrib['references'])].append(k.attrib['name'])
  187.             continue    
  188.        
  189.         if p.tag == "column-ref":
  190.             continue
  191.         if p.tag == "referenced-column":
  192.             continue
  193.            
  194.         if(p.tag == "column"):
  195.             spec[p.attrib["name"]] = p.attrib["type"]
  196.             continue
  197.        
  198.         if (p.tag == "row"):
  199.             if (len(item_dict)):
  200.                 data_arr.append(item_dict)
  201.             item_dict = {}
  202.             continue
  203.        
  204.         item_dict[p.tag] = str(p.text)
  205.     data_arr.append(item_dict)
  206.    
  207.    
  208.     ans  = "DROP TABLE IF EXISTS " + spec["table_name"] + ';' + '\n'
  209.    
  210.    
  211.     if frg_k and frg_ref:
  212.         final_str = ''
  213.         for i in frg_k:
  214.             frg_str = ' FOREIGN KEY ('
  215.             for k in frg_k[i]:
  216.                 frg_str += k
  217.                 frg_str += ','
  218.             frg_str = frg_str[:len(frg_str) - 1] + ')' + " REFERENCES " + i[1] + '('
  219.            
  220.             for k in frg_ref[i]:
  221.                 frg_str += k
  222.                 frg_str += ','
  223.             frg_str = frg_str[:len(frg_str) - 1] + '), '
  224.             final_str += frg_str
  225.         final_str = final_str[:len(final_str)-2]
  226.     else:
  227.         final_str = ''
  228.    
  229.    
  230.     ans  +=  "CREATE TABLE " + spec["table_name"] + " ("
  231.     for item in spec:
  232.         if(item != "table_name"):
  233.             ans += (item + " " + spec[item] + ", ")
  234.     if prm_k:
  235.         primk = ", PRIMARY KEY("
  236.         for j in prm_k:
  237.             primk += j
  238.             primk += ','
  239.         primk = primk[:len(primk)-1] + ')'
  240.            
  241.     else:
  242.         primk = ''
  243.            
  244.     ans = ans[:len(ans) - 2] + primk + final_str + ')'';' + '\n'
  245.    
  246.    
  247.     temp = "("
  248.     for i in spec:
  249.         if(i != "table_name"):
  250.             temp += i + ", "
  251.     temp = temp[:len(temp) - 2] + ")"
  252.    
  253.    
  254.     for row in data_arr:
  255.         ans += "INSERT INTO " + spec["table_name"]  + temp + " values"
  256.         values  = "("
  257.         for i in row:
  258.             if(spec[i] == 'VARCHAR(50)'):
  259.                 values += '"'+ row[i] +'"' + ", "
  260.                 continue
  261.             values += row[i] + ", "
  262.  
  263.            
  264.         values = values[:len(values) - 2] + ')'
  265.         ans += values + ';' + '\n'
  266.     return ans
  267.  
  268.  
  269. print(XML2DDL(r"C:\Users\PCAsusrog\Downloads\file8.xml"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement