在 XML 文件的主标签中提取所有子标签的值,无论标签名称如何

Extracting all sub-tags' values in a main tag for XML File no matter the tag name

<GPO>
    <Computer>
        <ExtensionData>
            <Extension xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/Security" 
             xsi:type="q1:SecuritySettings">
                <q1:Account>
                    <q1:Name>ClearTextPassword</q1:Name>
                    <q1:SettingBoolean>false</q1:SettingBoolean>
                    <q1:Type>Password</q1:Type>
                </q1:Account>

               <q1:Account>
                   <q1:Name>MaximumPasswordAge</q1:Name>
                  <q1:SettingNumber>120</q1:SettingNumber>
                  <q1:Type>Password</q1:Type>
               </q1:Account>
             </Extension>
       </ExtensionData>
    </Computer>
</GPO>

您好,这是我当前保存在 C:\XMLFile.xml 中的 XML 文件。我如何更改代码以使用 Python 3.8 而不是仅通过标签名称来提取每个 标签内的所有子标签值?我之前没有 XML 使用 Python 解析和阅读的经验。

到目前为止,这是我的代码:

from xml.dom import minidom

xmlFile = minidom.parse("C:\GPOReportAD.xml")

computer = xmlFile.getElementsByTagName("Computer")[0]

extensionData = computer.getElementsByTagName("ExtensionData")[0]

for i in extensionData.getElementsByTagName("q1:Name"):
  for x in extensionData.getElementsByTagName("q1:SettingBoolean"):
    print("Result: " + i.firstChild.data + " " + x.firstChild.data)
    break

预期输出:

ClearTextPassword    false
MaxmimumPasswordAge  120

您正在处理一个使用名称空间的 xml 片段,这让事情变得有点复杂。我认为,最好的方法是使用 lxml 中的 html(而不是 xml)解析器,并将 xpath 用于 select 值:

import lxml.html as lh
gpo = """[your snippet above]"""

doc = lh.fromstring(gpo)
#either:
for i in doc.xpath(".//*[local-name()='name']"):
#or
for i in doc.xpath(".//name", namespaces={'ql':'http://www.microsoft.com/GroupPolicy/Settings/Security'}):
    print(i.text,i.xpath('./following-sibling::*[1]/text()')[0])

输出:

ClearTextPassword false
MaximumPasswordAge 120