【发布时间】:2020-04-13 08:09:23
【问题描述】:
我将此 XML 作为字符串由 DB 查询返回为 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)
这是将 OutputTypeHandler 返回的元组转换为字符串后构建 XML 树的代码:
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 的每个子/孙的每个值,直到找到一个特定值:
对于根中的孩子: 如果(child.text == 'MG'): 打印(子。文本) 别的: 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>
未找到值 未找到值 未找到值 未找到值
如果我只打印从根目录中找到的每个孩子:
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 树是错误的,并且不知何故它没有被解析为标签。
【问题讨论】:
-
您需要创建一个递归函数来获取一个节点和一个字符串(要搜索的值)。然后该函数应该遍历孩子并检查它们的值是否相同。如果没有,那么如果孩子有孩子,则应该以孩子为节点调用自己。
-
感谢您的回答,确实,我没有这样想,干杯!