【问题标题】:Is there a way to parse all child values from a XML using python and return the tag name for the value found?有没有办法使用 python 解析 XML 中的所有子值并返回找到的值的标签名称?
【发布时间】: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 树是错误的,并且不知何故它没有被解析为标签。

【问题讨论】:

  • 您需要创建一个递归函数来获取一个节点和一个字符串(要搜索的值)。然后该函数应该遍历孩子并检查它们的值是否相同。如果没有,那么如果孩子有孩子,则应该以孩子为节点调用自己。
  • 感谢您的回答,确实,我没有这样想,干杯!

标签: python xml


【解决方案1】:

lastModifiedBy 嵌入在 Parent3 中,而 Parent2Parent1 本身也嵌入 - 这就是为什么在您的方法中找不到匹配 MG 的文本。

如果您想采用这种方法,您需要定义方法,如果给定元素有子元素,该方法会递归检查每个子元素。

请参考:ElementTree - findall to recursively select all child elements

【讨论】:

  • 感谢您的帮助,伙计!我选择了fourtheye生成器递归方法,它返回&lt;generator object find_rec at 0x052B4CB0&gt;,有没有办法返回特定值的标签(子)的实际名称?甚至是完整路径,任何人都可以
  • 我并不真正精通将 XML 与 Python 结合使用,但我能想到的第一种方法是将路径附加到递归函数中。尝试深入研究 XMLElementTree 文档。
  • 在进一步分析您提供的链接中提供的解决方案后,我得出结论,这不是我要寻找的,递归函数仅在 XMl 中搜索特定的标签名称,我需要在标签的内容中搜索一个特定的值......它仍然很有帮助,不要误会我的意思,但我需要先弄清楚然后我可以将线程标记为已解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多