在 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
<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 而不是仅通过标签名称来提取每个
到目前为止,这是我的代码:
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