2016-05-24 19 views
0

Es gibt eine Menge Antworten auf meine Frage zum Beispiel Parse XML namespaces with php SimpleXML Aber ich kann nicht verstehen, wie Sie den Code anpassen, um Wert in meinem Fall zu lesen? Ich habe einen Namespace m: innerhalb eines Namespace soap: Ich brauche diese XML zu analysieren und nur den Wert 888-0000019749Parsen XML mehrere Namespaces mit PHP SimpleXML

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Body> 
     <m:SaveDocumentsResponse xmlns:m="http://www.cargo3.ru"> 
      <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
       <m:Key>SaveDocuments</m:Key> 
       <m:List> 
        <m:Key>Order</m:Key> 
        <m:Properties> 
         <m:Key>Number</m:Key> 
         <m:Value xsi:type="xs:string">888-0000019749</m:Value> 
         <m:ValueType>string</m:ValueType> 
        </m:Properties> 
        <m:Properties> 
         <m:Key>CreateDate</m:Key> 
         <m:Value xsi:type="xs:dateTime">2016-05-23T20:56:50</m:Value> 
         <m:ValueType>dateTime</m:ValueType> 
        </m:Properties> 
       </m:List> 
      </m:return> 
     </m:SaveDocumentsResponse> 
     </soap:Body> 
</soap:Envelope> 

Auch parse an XML with SimpleXML which has multiple namespaces versucht, diesem Beispiel

$xml = simplexml_load_string($res, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/"); 
$xml->registerXPathNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/'); 
$xml->registerXPathNamespace('m', 'http://www.w3.org/2001/XMLSchema'); 

foreach($xml->xpath('//m:SaveDocumentsResponse') as $header) 
{ 
    var_export($header->xpath('//m:return')); // Should output 'something'. 

} 
arbeiten kann nicht verwalten extrahieren

wieder bin ich etwas fehlt ...

und wieder

echo $list = (string)$xml->children('soap', true)->Body->children('m', true)->SaveDocumentsResponse->return->List; 

Ich brauche die kürzeste und einfachste Weg, um Wert zu extrahieren aus

<m:Value xsi:type="xs:dateTime">2016-05-23T20:56:50</m:Value> 
+0

Hallo, ich nicht wissen viel über SimpleXml dafür. Ich kann DomDocument verwenden – Richard

+0

Hi! Jede Methode bringt mir etwas Erfahrung. Alle Arbeitsbeispiele sind willkommen. – vyazikov

+0

Überprüfen Sie Beispiele unter der Dokumentation http://php.net/manual/en/domxpath.registernamespace.php – Richard

Antwort

0

Sie benötigen ein Präfix an den entsprechenden NamespaceURI nach Ihren XML-Daten abzubilden. So nach Ihren XML, benötigen Präfix 'http://www.cargo3.ru' zu URI abgebildet werden:

$xml->registerXPathNamespace('m', 'http://www.cargo3.ru'); 

foreach($xml->xpath('//m:SaveDocumentsResponse') as $header) 
{ 
    var_export($header->xpath('//m:return')); // Should output 'something'. 
} 

eval.in demo

Ausgang:

array (
    0 => 
    SimpleXMLElement::__set_state(array(
)), 
)