You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SimpleXMLElement生成含URL属性XML的异常问题求助

使用SimpleXMLElement生成XML签名结构的问题

我想用SimpleXMLElement生成符合XMLDSig标准的签名结构,但始终得到错误结果,具体问题如下:

错误输出与期望输出对比

实际生成的XML片段:

<pt:SignedInfo>
            <pt: www.w3.org TR 2001 REC-xml-c14n-20010315#WithComments"/>
            <pt: www.w3.org 2001 04 xmldsig-more#rsa-sha256"/>
</pt:SignedInfo>

期望的正确XML片段:

<SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
            <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
</SignedInfo>

尝试的代码

我通过定义数组结构,调用addChild方法生成XML,相关代码如下:

$algorithm1 = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments";
$algorithm2 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
$algorithm3 = "http://www.w3.org/2001/04/xmlenc#sha256";
$signatureStructure = array(
    
    'SignedInfo' => array(
        'CanonicalizationMethod Algorithm="'.$algorithm1.'"' => "",
        'SignatureMethod Algorithm="'.$algorithm2.'"' => "",
        'Reference Id="main_sign" URI=""' => array(
            'Transforms' => '',
            'DigestMethod Algorithm="'.$algorithm3.'"' => "",
            'DigestValue' => '',
        )
    ),

其他问题

除了属性生成错误,还遇到节点位置错误:SignedInfo被生成到Signature节点外部:

<pt:Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <pt:SignatureValue/>
        <pt:KeyInfo>
            <pt:X509Data>
                <pt:X509Certificate/>
            </pt:X509Data>
        </pt:KeyInfo>
    </pt:Signature>
    <pt:SignedInfo/> <!-- 该节点位于Signature外部 -->

完整期望结构

我需要生成的完整XML签名结构如下:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
            <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <Reference Id="main_sign" 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>74aHiOhEsIwaRwbWLLfwQsfafGWARZJMbEu7X2nMasw=</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>AARgcTwana1w....GdFBEN/3P
/FDJUHQw63h/T4ghVWs=</SignatureValue>
        <KeyInfo>
            <X509Data>
                <X509Certificate>MIID....AyzVyw==</X509Certificate>
            </X509Data>
        </KeyInfo>
    </Signature>

当前实际完整结构

目前实际生成的结构:

<pt:Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <pt:SignedInfo>
            <pt: www.w3.org TR 2001 REC-xml-c14n-20010315#WithComments"/>
            <pt: www.w3.org 2001 04 xmldsig-more#rsa-sha256"/>
            <pt:Reference Id="main_sign" URI="">
                <pt:Transforms/>
                <pt: www.w3.org 2001 04 xmlenc#sha256"/>
                <pt:DigestValue/>
            </pt:Reference>
        </pt:SignedInfo>
        <pt:SignatureValue/>
        <pt:KeyInfo>
            <pt:X509Data>
                <pt:X509Certificate/>
            </pt:X509Data>
        </pt:KeyInfo>
    </pt:Signature>

问题排查更新

我发现问题根源:SimpleXMLElement会自动删除URL中的http://前缀,移除该前缀后属性能正常设置,但我需要保留http://,请问如何用这个库解决?

内容的提问来源于stack exchange,提问作者scorpions77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:08:11