if-else в XML синтаксическом разборе с помощью ElementTree find - PullRequest
0 голосов
/ 14 июля 2020

У меня большой входной файл. Я просто упоминаю образец ниже:

      <metadata-record class='column'>
        <remote-name>Customer Name</remote-name>
        <remote-type>130</remote-type>
        <local-name>[Customer Name]</local-name>
        <parent-name>[Custom SQL Query]</parent-name>
        <remote-alias>Customer Name</remote-alias>
        <ordinal>5</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>Discount</remote-name>
        <remote-type>5</remote-type>
        <local-name>[Discount]</local-name>
        <parent-name>[Custom SQL Query]</parent-name>
        <remote-alias>Discount</remote-alias>
        <ordinal>6</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>

Я хочу написать сопоставление , когда оно доступно, иначе точность значение тега. Но когда я пытаюсь запустить этот код, я не могу получить последний (даже если я уверен, что соответствующий узел присутствует).

Это мой код:

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

xmlTree = et.parse('Input.xml')
xmlRoot = xmlTree.getroot()
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'): 
                colprec.append(x.find('precision').text) 
                print("1")
            else:
                colcolla.append(x.find('collation').text) 
                print("2")

, но я получаю следующий результат с Attrubute error:

2
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-2006350475d2> in <module>
     14                 print("1")
     15             else:
---> 16                 colcolla.append(x.find('collation').text)
     17                 print("2")
     18 

AttributeError: 'NoneType' object has no attribute 'text'

Мои выходные данные такие же, как и входные, для первой записи метаданных есть тег 'сопоставления', поэтому он должен быть напечатан для следующего тега точность есть, так что это должно быть напечатано. Мой результат, который я ожидаю, - это образец XML, который я вставил выше. Теперь я получаю только записи метаданных с тегом сопоставления. Я не получаю точности.

1 Ответ

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

Метод find класса ElementTree

Возвращает экземпляр элемента или None.

Условное выражение if x.find('precision'):, которое вы тестируете, оценивается как истинное, если его аргумент равен логическому True. Но даже если узел precision найден, возвращаемое значение не будет логическим!

Вам просто нужно проверить, что возвращаемое значение find отличается от None:

if x.find('precision') is not None: 
    colprec.append(x.find('precision').text) 
    print("1")
else:
    colcolla.append(x.find('collation').text) 
    print("2")

Вывод:

2
1
...