首页 > 解决方案 > 无法解析 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>

标签: pythonxml-parsing

解决方案


您可以通过其索引访问 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)

推荐阅读