[PHP] XML find and replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • delenn
  • Registratie: Mei 2000
  • Laatst online: 02-08-2024
Hoi mensen,

Ik ben bezig voor de hobby (en omdat ik het nodig heb voor een projectje) MTOM encoded SOAP te implementeren in PHP. Ik weet dat er een kan en klare PECL extensie voor is, maar dat is geen optie omdat het service gedeelte van de app op een standaard cheapo hosting moet kunnen draaien.

Het gedeelde waar ik nu een beetje in de knoei zit is ik moet de SOAP die de standaard PHP soap server oplevert omzetten naar een XOP pakket, daarvoor moet ik het element dat naar een attachment verwijst vervangen door een XOP referentie, like so:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="QlixSoap2"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:getDocumentResponse>
         <response xsi:type="ns1:DocumentHeader">
            <success xsi:type="xsd:boolean">true</success>
            <name xsi:type="xsd:string">text.php</name>
            <size xsi:type="xsd:int">3300</size>
            <mimetype xsi:type="xsd:string">text/plain</mimetype>
            <file xsi:type="xsd:base64binary">34567</file>
         </response>
      </ns1:getDocumentResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


moet worden:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="QlixSoap2" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xmlmime="http://www.w3.org/2004/11/xmlmime">
   <SOAP-ENV:Body>
      <ns1:getDocumentResponse>
         <response xsi:type="ns1:DocumentHeader">
            <success xsi:type="xsd:boolean">true</success>
            <name xsi:type="xsd:string">text.php</name>
            <size xsi:type="xsd:int">3300</size>
            <mimetype xsi:type="xsd:string">text/plain</mimetype>
            <file xmlmime:contentType="text/plain"><xop:Include href="cid:5346efa34" /></file>
         </response>
      </ns1:getDocumentResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


de href attribuut verwijst weer naar een MIME attachment met content-id parameter gelijk aan de href.

Ik heb me met dit idee wel een lekkere hobby op de hals gehaald.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En dan vooral niet vergeten alles netjes te encoden e.d. Maar 1 tip: XML wil je als XML behandelen, niet als string. Sla je deze weg toch in dan komt 't je vroeger of later ontzettend hard in je reet bijten. Gebruik dus XMLDom of whatever voor je toepassing geschikt is en ga niet met stringfuncties aan 't klooien om XML te bewerken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

True, maar zonder meer informatie kun je toch weinig.

Als alle XML-data er hetzelfde uitziet kan het toch weinig kwaad om een node te replacen? Zoek "<file" en "file/>" op en plak alles dat ervoor en erna komt om de nieuwe string heen. En nee, dat is eigenlijk niet wat ik eerst zei :+

[ Voor 13% gewijzigd door CodeCaster op 28-03-2010 17:53 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • delenn
  • Registratie: Mei 2000
  • Laatst online: 02-08-2024
CodeCaster schreef op zondag 28 maart 2010 @ 17:49:
True, maar zonder meer informatie kun je toch weinig.

Als alle XML-data er hetzelfde uitziet kan het toch weinig kwaad om een node te replacen? Zoek "<file" en "file/>" op en plak alles dat ervoor en erna komt om de nieuwe string heen. En nee, dat is eigenlijk niet wat ik eerst zei :+
Wie zegt dat het bewuste tag altijd file heet :P

Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

RobIII schreef op zondag 28 maart 2010 @ 17:44:
[...]

En dan vooral niet vergeten alles netjes te encoden e.d. Maar 1 tip: XML wil je als XML behandelen, niet als string. Sla je deze weg toch in dan komt 't je vroeger of later ontzettend hard in je reet bijten. Gebruik dus XMLDom of whatever voor je toepassing geschikt is en ga niet met stringfuncties aan 't klooien om XML te bewerken.
Mwah. Je kan PHP als parser gebruiken. Dus inladen, bewerken, en als XML weer uitspugen.

Bij een forum waar geen RSS-feed is, doe ik het zelfde. ik haal de HTML op met file_get_contents, en spuug netjes RSS uit. Het programma wat die data vervolgens gebruikt weet niet dat het bewerkte data is.

Je zet er dus gewoon een extra laag omheen.

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

delenn schreef op zondag 28 maart 2010 @ 18:58:
[...]


Wie zegt dat het bewuste tag altijd file heet :P
Dat had jij moeten vertellen. ;)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Is het niet mogelijk om via DomDocument het stuk uit te lezen en dan het bepaalde element daar te veranderen :?

Acties:
  • 0 Henk 'm!

  • delenn
  • Registratie: Mei 2000
  • Laatst online: 02-08-2024
4Real schreef op zondag 28 maart 2010 @ 19:54:
Is het niet mogelijk om via DomDocument het stuk uit te lezen en dan het bepaalde element daar te veranderen :?
Ik ben bezig (en al een eindje gevorderd inmiddels) het daarmee te doen..
De twee namespaces toevoegen is al gelukt. Ik kan inmiddels met een recursieve methode the base64 element(en) eruithalen, nu nog het vervangen met een correcte xop:Include.

Ook dat is gelukt, alleen loopt ie nu om een vage reden de hele boom 2 keer na (en elke subnode ook weer). Niet zo fijn dus met (O n^2)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private function recursiveDOMFind($node, $parent) {
      $doc=$node->ownerDocument;
      debug("Inspecting element ". $node->tagName);
      if ($node instanceof DOMElement) {
        if($node->hasAttribute('xsi:type')) {
          debug("Element ".$node->tagName." has type attribute");
          if($node->getAttribute('xsi:type')=="xsd:base64binary") {
            debug("Found base64 element");
            // Contruct a new Element node to replace this one;
            $newNode=$doc->createElement($node->tagName);
            $newXopInclude=$doc->createElement("xop:Include");
            $hrefAttr= $doc->createAttribute("href");
            $hrefAttr->value="Testing123";
            $newXopInclude->appendChild($hrefAttr);
            $newNode->appendChild($newXopInclude);
            
            $parent->replaceChild($newNode,$node);
          }
        }
        $nodelist = $node->getElementsByTagName("*");
        $id=0;
        for($id; $id<($nodelist->length); $id++) {
          $item= $nodelist->item($id);
          $this->recursiveDOMFind($item, $node);
        }
      }
    }

[ Voor 57% gewijzigd door delenn op 28-03-2010 20:29 ]

Pagina: 1