Массив в л oop, XML python - PullRequest
       4

Массив в л oop, XML python

0 голосов
/ 14 июля 2020

У меня есть образец входного файла

<metadata-records>
      <metadata-record class='column'>
        <remote-name>Category</remote-name>
        <remote-type>130</remote-type>
        <local-name>[Category]</local-name>
        <parent-name>[Custom SQL Query]</parent-name>
        <remote-alias>Category</remote-alias>
        <ordinal>1</ordinal>
        <local-type>string</local-type>
        <aggregation>Count</aggregation>
        <contains-null>true</contains-null>
        <collation>LEN_RUS_S2_WO</collation>
        <attributes>
          <attribute datatype='string' name='DebugRemoteType'>&quot;WSTR&quot;</attribute>
        </attributes>
      </metadata-record>
      <metadata-record class='column'>
        <remote-name>Quantity</remote-name>
        <remote-type>5</remote-type>
        <local-name>[Quantity]</local-name>
        <parent-name>[Custom SQL Query]</parent-name>
        <remote-alias>Quantity</remote-alias>
        <ordinal>8</ordinal>
        <local-type>real</local-type>
        <aggregation>Sum</aggregation>
        <precision>15</precision>
        <contains-null>true</contains-null>
        <attributes>
          <attribute datatype='string' name='DebugRemoteType'>&quot;R8&quot;</attribute>
        </attributes>
      </metadata-record>
    </metadata-records>

Мой код ниже


import xml.etree.cElementTree as et
import shutil, os
colName  = []
colType  = []
colLname = []
colPname = []
colAlias = []
colOrd   = []
colLtype = []
colagg   = []
colcolla = []
colprec  = []
colcnull = []

for x in xmlRoot.findall('./connection/metadata-records/metadata-record'):
            colName.append(x.find('remote-name').text) 
            colType.append(x.find('remote-type').text) 
            colLname.append(x.find('local-name').text) 
            colPname.append(x.find('parent-name').text) 
            colAlias.append(x.find('remote-alias').text) 
            colOrd.append(x.find('ordinal').text) 
            colLtype.append(x.find('local-type').text) 
            colagg.append(x.find('aggregation').text)
            colcnull.append(x.find('contains-null').text)
            
            if x.find('precision') is not None: 
                    colprec.append(x.find('precision').text) 
                    print("1")
            else:
                    colcolla.append(x.find('collation').text) 
                    print("2")

output = et.Element("output")
sql = et.SubElement(output, "sql")
sql.text = sqlString
metadatarecords = et.SubElement(output, "metadata-records")

for i in range(colNumber):
    column = et.SubElement(metadatarecords, "metadata-record")
    colname = et.SubElement(column, "remote-name")
    colname.text = colName[i]
    datatype = et.SubElement(column, "remote-type")
    datatype.text = colType[i]
    Localname = et.SubElement(column, "local-name")
    Localname.text = colLname[i]
    Parentname = et.SubElement(column, "parent-name")
    Parentname.text = colPname[i]
    alias = et.SubElement(column, "remote-alias")
    alias.text = colAlias[i]
    Ord = et.SubElement(column, "ordinal")
    Ord.text = colOrd[i]
    ltype = et.SubElement(column, "local-type")
    ltype.text = colLtype[i]
    aggre = et.SubElement(column, "aggregation")
    aggre.text = colagg[i]
        
    **if  colcolla is not None :
          coll = et.SubElement(column, "collation")
          coll.text = colcolla[i]
    else:
            cpr = et.SubElement(column, "precision")
            cpr.text = colprec[i]**
        
    cnull = et.SubElement(column, "contains-null")
    cnull.text = colcnull[i]

Когда я пытаюсь записать массив, я выхожу из индекса, потому что когда colcolla [i] там colprec [i] не будет, аналогично наоборот. так что мой вывод такой же, как и ввод для проверки. если я запустил приведенный выше код, я выхожу из ошибки индексного массива. Может кто-нибудь помочь, я не смог найти, в чем проблема .. Спасибо, Аару sh

1 Ответ

0 голосов
/ 14 июля 2020

Ваша проблема связана с colNumber. Кажется, он не назначен в вашем коде?

Проблема возникает при запуске for i in range(colNumber). Если colNumber больше, чем размер colcolla или colprec, вы получите индекс из ошибка массива.

Поскольку вы добавляете в массив, если colcolla или colprec присутствует и имеет размер 1, но colNumber=2, на втором проходе, где i=1, colcolla[i] и colprec[i] вызовут ошибку отсутствия индекса.

Вы должны использовать отдельный счетчик для индексации colcolla и collprec вместо использования colNumber.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...