2013-02-21 4 views
2
SimpleXML을 사용하여 자식 요소를 제거

XML :네임 스페이스와

<?xml version="1.0"?> 
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_9069a2d7-491f-49ca-a13f-96c5bad39b14" IssueInstant="2010-04-06T16:27:34Z" Version="2.0"> 
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://ssl.perquisite.net/memberweb/federation</saml:Issuer> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
     <Reference URI="#_9069a2d7-491f-49ca-a13f-96c5bad39b14"> 
     <Transforms> 
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
      <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
      <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default saml ds xs xsi"/> 
      </Transform> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
     <DigestValue>QpoCI6jZFhQi+PuYM6UaFBL9KEU=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>X8X6qSUDKa3h3+/girXCeOVxo8=</SignatureValue> 
    <KeyInfo> 
     <X509Data> 
     <X509Certificate>MIIB2...CieOpEo35g==</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
    </Signature> 
    <saml:Subject> 
    <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">654d2065-6eed-401f-bf6d-a181117a5fb8</saml:NameID> 
    </saml:Subject> 
    <saml:Conditions NotBefore="2010-04-06T16:27:04Z" NotOnOrAfter="2010-04-06T16:28:04Z"/> 
    <saml:AuthnStatement AuthnInstant="2010-04-06T16:27:34Z"> 
    <saml:AuthnContext> 
     <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:X509</saml:AuthnContextClassRef> 
    </saml:AuthnContext> 
    </saml:AuthnStatement> 
</saml:Assertion> 

번호 :

$xml은 상기 XML 설정된다. 서명 노드와 XML의 어린이 : 나는 시그 제거 할이 시점에서

$sxml = new SimpleXMLElement($xml); 
$sxml->registerXPathNamespace('saml', 'urn:oasis:names:tc:SAML:2.0:assertion'); 
$sxml->registerXPathNamespace('sig', 'http://www.w3.org/2000/09/xmldsig#'); 

$signodes = $sxml->xpath('/saml:Assertion/sig:Signature'); 

. 나는 시도했다 :

$node = dom_import_simplexml($signodes[0]); 
$node->parentNode->removeChild($node); 

과 :

foreach($signodes as $item) { 
    $node = dom_import_simplexml($item); 
    $node->parentNode->removeChild($node); 
} 

과 :

unset($signodes); 

를 실행 한 다음,

:

foreach($signodes as $node) { 
    unset($node); 
} 

한 다음에 XML을 다시 받고

$Canonical = $sxml->asXML(); 

위의 결과는 모두 결과 XML 에 아무런 영향을 미치지 않지만 오류는 발생하지 않습니다.

누구나 단서가 있습니까?

+0

나에게 맞는 것 같습니다. 나는 그것을 국부적으로 복제하려고 노력할 것이다. 질문은 upvote를 얻습니다. 왜냐하면 실제로 시도한 것을 정확하게 게시했기 때문에 질문을 올리며 여기서 희귀 한 질문을 던졌습니다. – mkaatman

+2

dom_import_simplexml 및 removechild를 사용하는 예제가 여기 나와 있습니다. http://codepad.org/b4emqwCA – mkaatman

+0

감사합니다 mkaatman, 코드를 읽기 쉽도록 단순화 했으므로 실제 코드와 관련이 있다고 가정합니다. 변수의 범위가 "되돌릴"수 있습니다. –

답변

0

mkaatman의 말처럼, php에는 removeChild 메소드가 있습니다. (http://php.net/manual/en/domnode.removechild.php)

예를 들어 어린이를 삭제할 수 있습니다. $ node-> parentNode-> removeChild ($ node);

+0

나는 이것을 이미 알고 있었고, 네임 스페이스와 함께 사용할 수 있는지 묻고있었습니다. 대답은 "그렇습니다"입니다. 나는 코드를 실수로 작성했습니다. –

관련 문제