python - 无法解析 XML 文件中的签名节点
问题描述
我正在尝试解析 XML 中的“签名”节点并获取 XML 中 DigestValue 和 SignatureValue 字段的值。我看到的输出是
{'{http://www.w3.org/2000/09/xmldsig#}SignedInfo', '{http://www.w3.org/2000/09/xmldsig#}SignatureValue'}
#python parses logic is as below
import os
import xml.etree.ElementTree as ET
root = ET.parse("MyFile.xml").getroot()
for Signature in root.findall('Signature'):
attributes = Signature.attrib
print(attributes.get("xmlns"))
for element in Signature:
ElementName = element.tag
ElementValue = Signature.find(ElementName).text
print(ElementName, ':', ElementValue)
用于解析的xml文件片段如下
<Manifest>
<Signature
xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>YzE5K8Y9+gIrLDqLsvunqquxPxSNTphOadUpEOVbAV4=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>I6iJvmecDy0Cm8jMwv/wlmT0oYkuPRpmieHgbZW8E47yrNLfQhpKUC8zxn9nQarceS6bCN44TeUz7lQz6q53odzfmN6SgpeCaBIXeAeJI7gnmdZO+iXYi3DKZ/3NuEkqpVEpR+hwLeTBWODaIHHm4I0huRlLppN2FC4jJn9qxIaXVQXRb+1PBEavulLlYI8z5dJPatyMDAr0YLTx3FEhYr+i6Jt2YHq0ykZ7mjFQTZQkzo6kQws9+aUaBURbdntJYWwqe7ofTVX0jdd1fD0i3LdYeHkA/+tJQg4BvAQE5HUi2oYdeYrt7sRxV+NN94Tgj7fHOscVZiUsCJew+Ah19g==</SignatureValue>
</Signature>
</Manifest>
解决方案
您可以通过其索引访问 xml 元素,如下所示
import os
import xml.etree.ElementTree as ET
root = ET.parse("MyFile.xml").getroot()
print(root[0][0][2][-1].text)
print(root[0][-1].text)
输出
YzE5K8Y9+gIrLDqLsvunqquxPxSNTphOadUpEOVbAV4=
I6iJvmecDy0Cm8jMwv/wlmT0oYkuPRpmieHgbZW8E47yrNLfQhpKUC8zxn9nQarceS6bCN44TeUz7lQz6q53odzfmN6SgpeCaBIXeAeJI7gnmdZO+iXYi3DKZ/3NuEkqpVEpR+hwLeTBWODaIHHm4I0huRlLppN2FC4jJn9qxIaXVQXRb+1PBEavulLlYI8z5dJPatyMDAr0YLTx3FEhYr+i6Jt2YHq0ykZ7mjFQTZQkzo6kQws9+aUaBURbdntJYWwqe7ofTVX0jdd1fD0i3LdYeHkA/+tJQg4BvAQE5HUi2oYdeYrt7sRxV+NN94Tgj7fHOscVZiUsCJew+Ah19g==
为了可扩展性,如果您想解析每个元素以找到感兴趣的值,请使用以下程序。
这会产生与上面相同的输出。
import xml.etree.ElementTree as ET
root = ET.parse("MyFile.xml").getroot()
def printval(tg):
if tg.tag.endswith("DigestValue"):
print(tg.text)
return
if tg.tag.endswith("SignatureValue"):
print(tg.text)
return
if len(list(tg))>=1:
for b in tg:
printval(b)
printval(root)
推荐阅读
- ansible - 使用 item 更改命令行中的参数
- python - 熊猫将额外的零添加到十进制值
- c# - 将多个查询参数传递给 TableAdaper 填充方法 C#
- python-3.x - 无法在 Python 上打开和导入文件
- wordpress - 如何在 WordPress 中为移动菜单图标添加 ALT 或 Title 属性
- mysql - 如何在mysql中使用嵌套查询
- c++ - 如何在 Node 类中创建类型为医生的对象?
- python - 使用 selenium 访问 shadow DOM 元素
- ipv6 - nftables - IPv6 端口敲击 - 接受整个子网
- ssl - Spring Cloud Gateway 和 Eureka 在 SSL 中工作,微服务默认为 HTTP,但应该是 HTTPS