У меня есть 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, построенное на основе строки, является ошибочным и почему-то не анализируется тег на тег.