Есть ли способ проанализировать все дочерние значения из XML с помощью python и вернуть имя тега для найденного значения? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть XML как строка, возвращаемая запросом БД в виде clob и преобразованная с использованием метода OutputTypeHandler, который возвращает контекст элемента clob в кортеже:

Это код, который возвращает кортеж из содержимое clob:

def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
    return  cursor.var(cx_Oracle.LONG_STRING,arraysize=cursor.arraysize)

Это код, в котором строится дерево XML после преобразования кортежа, возвращенного OutputTypeHandler, в строку:

import xml.etree.ElementTree as ET

conn.outputtypehandler = OutputTypeHandler
c = conn.cursor()
c.execute("""select Clob from Table""") 

clobData = c.fetchone()
str =  ''.join(clobData) #saving the new string value as str
root = ET.fromstring(str) #building the xml Tree using xml.etree.ElementTree as ET
ET.dump(root)

Результирующее сообщение XML (копия XML в БД):

<Parent>
<Batch_Number>2000</Batch_Number>
<Total_No_Of_Batches>12312</Total_No_Of_Batches>
<requestNo>1923</requestNo>
<Parent1>
    <Parent2>
        <Parent3>
                <lastModifiedDateTime>2022-11-11T11:07:30.000</lastModifiedDateTime>
                <purpose>NeverMore</purpose>
                <endDate>9999-12-31T00:00:00.000</endDate>
                <createdDateTime>2019-06-06T06:32:16.000</createdDateTime>
                <createdOn>2019-06-06T08:32:16.000</createdOn>
                <address2>Forever street 21</address2>
                <externalCode>home</externalCode>
                <lastModifiedBy>user2.thisUser</lastModifiedBy>
                <lastModifiedOn>2039-06-11T13:07:30.000</lastModifiedOn>
                <lastModifiedBy>MG</lastModifiedBy>
                <PS>1234431</PS>
        </Parent3>
    </Parent2>
</Parent1>

Здесь я пытаюсь изучить каждое значение каждого ребенка / внука XML до Я нахожу определенное значение c:

для дочернего элемента в root: if (child.text == 'MG'): print (child.text) else: print ("Значение не найдено")

Результат действительно странный, и я не понимаю, откуда он исходит:

<Parent>
<Batch_Number>2000</Batch_Number>
<Total_No_Of_Batches>12312</Total_No_Of_Batches>
<requestNo>1923</requestNo>
<Parent1>
    <Parent2>
        <Parent3>
                <lastModifiedDateTime>2022-11-11T11:07:30.000</lastModifiedDateTime>
                <purpose>NeverMore</purpose>
                <endDate>9999-12-31T00:00:00.000</endDate>
                <createdDateTime>2019-06-06T06:32:16.000</createdDateTime>
                <createdOn>2019-06-06T08:32:16.000</createdOn>
                <address2>Forever street 21</address2>
                <externalCode>home</externalCode>
                <lastModifiedBy>user2.thisUser</lastModifiedBy>
                <lastModifiedOn>2039-06-11T13:07:30.000</lastModifiedOn>
                <lastModifiedBy>MG</lastModifiedBy>
                <PS>1234431</PS>
        </Parent3>
    </Parent2>
</Parent1>

Значение не найдено Значение не найдено Значение не найдено Значение не найдено

Если я только распечатаю, каждый ребенок находит от root:

  for child in root:
       print(child)

Результат:

*Whole XML*
<Element 'Batch_Number' at 0x05203E10>
<Element 'Total_No_Of_Batches' at 0x05203E70>
<Element 'requestNo' at 0x05203EA0>
<Element 'Parent1' at 0x05203ED0>

Я попробовал другой подход:

    element = root.find('MG')

if not element:  
    print "element not found, or element has no subelements"

if element is None:
    print "element not found"

Результат был таким же, полный xml напечатан и элемент не найден:

*WholeXML*
element not found, or element has no subelements
element not found

Я не конечно, что я делаю не так, я предполагаю, что дерево XML, построенное на основе строки, является ошибочным и почему-то не анализируется тег на тег.

1 Ответ

0 голосов
/ 13 апреля 2020

lastModifiedBy встроен в Parent3, который сам встроен в Parent2 и Parent1 - поэтому в вашем подходе вы не найдете текст, соответствующий MG.

Если Вы хотите следовать этому подходу, вам нужно определить метод, который рекурсивно проверяет каждого потомка, если у данного элемента есть потомки.

Пожалуйста, обратитесь к: ElementTree - findall для рекурсивного выбора всех дочерних элементов

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