在属性标签xml中设置url

问题描述 投票:0回答:1

我正在尝试将标签中的 url 添加到我的 xml 结构中。我总是得到这个:

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

我需要:

<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"/>

尝试创建我正在做的结构:

$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' => '',
                        )
                    ),

我尝试使用以下代码将空数组传递给生成 xml 的函数:

$wrapper4 = $xml->addChild('pt:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"');
            $this->signatureStructure($signatureStructure, $xml, $wrapper4);

但这会返回正确的结构,但是超出了我的标签:

<pt:Signature xmlns="http://www.w3.org/2000/09/xmldsig#">

例如,使用标签

SignedInfo
我正在这样做:

$wrapper4 = $xml->addChild('pt:SignedInfo');
$this->signedInfo($signedInfo, $xml, $wrapper4);

我的回报是:

<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/>** this it´s out of signature

我需要创建这个结构:

<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

合作

更新:

我发现我的问题了。这是 simpleXMLElement 从我的网址中删除

http://
,如果我删除
http://
,请正确设置此属性。我不知道这个库是否有办法解决这个问题

谢谢你的自述,抱歉我的英语不好

php xml xml-parsing
1个回答
0
投票

SimpleXML 是基本、简单 XML 结构的抽象 - 对所有功能使用 DOM。此外,属性需要单独设置,而不是作为节点名称的一部分。 XML 使用命名空间,因此您应该使用命名空间感知方法来创建元素节点。

在 DOM 中,创建和附加节点是两个单独的调用。您可以使用文档对象的方法创建节点,并使用父节点对象追加/插入它。

$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";

// define a variable for the namespace URI
$XMLNS_SIGNATURE = 'http://www.w3.org/2000/09/xmldsig#';

$document = new DOMDocument();

/* append the node */
$document->appendChild(
   /* create an element node inside the namespace and store it for later use */
   $signature = $document->createElementNS($XMLNS_SIGNATURE, 'Signature')    
);

$signature->appendChild(
   $signedInfo = $document->createElementNS($XMLNS_SIGNATURE, 'SignedInfo')    
);

$signedInfo->appendChild(
   $canonicalizationMethod = $document->createElementNS($XMLNS_SIGNATURE, 'CanonicalizationMethod')
);
// set an attribute without a namespace
$canonicalizationMethod->setAttribute('Algorithm', $algorithm1);

$signedInfo->appendChild(
   $signatureMethod = $document->createElementNS($XMLNS_SIGNATURE, 'SignatureMethod')
);
$signatureMethod->setAttribute('Algorithm', $algorithm2);


$signedInfo->appendChild(
   $reference = $document->createElementNS($XMLNS_SIGNATURE, 'Reference')
);
$reference->setAttribute('Id', 'main_sign');
$reference->setAttribute('URI', '');


$reference->appendChild(
   $document->createElementNS($XMLNS_SIGNATURE, 'Transforms')
);

$reference->appendChild(
   $digestMethod = $document->createElementNS($XMLNS_SIGNATURE, 'DigestMethod')
);
$digestMethod->setAttribute('Algorithm', $algorithm3);

$reference->appendChild(
   $digestValue = $document->createElementNS($XMLNS_SIGNATURE, 'DigestValue')
);
/* set text content (replaces current content and child nodes) */
$digestValue->textContent = '123456...';

$signature
  ->appendChild(
     $document->createElementNS($XMLNS_SIGNATURE, 'SignatureValue')
  )
  ->appendChild(
     /* create a text node */
     $document->createTextNode('123456...')
  );


$document->formatOutput = true;
echo $document->saveXML();

输出:

<?xml version="1.0"?>
<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/>
      <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
      <DigestValue>123456...</DigestValue>
    </Reference>
  </SignedInfo>
  <SignatureValue>123456...</SignatureValue>
</Signature>
© www.soinside.com 2019 - 2024. All rights reserved.