在XML文件的主标记中提取所有子标记的值,而不管标记名是什么

2024-09-27 07:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

<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文件。如何更改代码以提取每个<;问题1:客户>;使用Python3.8而不是仅仅通过标记名进行标记?我以前没有使用Python解析和阅读XML的经验

这是我目前的代码:

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

Tags: namefalsetypeextensionaccountpasswordxmlcomputer
1条回答
网友
1楼 · 发布于 2024-09-27 07:17:21

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

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

相关问题 更多 >

    热门问题