Jason Murray
Jason Murray

Reputation: 147

Extract data from XML with namespaces

I can't quite get the coding right to extract this one string (hostPIN) from the XML response below. I've been searching and can't get anything to work. How can I extract that data using PHP?

I am posting just the path to the data I need to get because the XML data is quite large.

<serv:message>
 <serv:body>
  <serv:bodyContent xsi:type="use:getUserResponse">
   <use:personalMeetingRoom>
     <use:hostPIN>1234</use:hostPIN>

How do I extract 1234? The namespaces are confusing and I can't find some code that would work with this.

Upvotes: 0

Views: 581

Answers (2)

Jason Murray
Jason Murray

Reputation: 147

Thanks @fusion3k after a few more tweaks I got it to work with

$dom = new DOMDocument();
$dom->loadXML( $data, LIBXML_NOBLANKS );
$nsURI = "http://www.webex.com/schemas/2002/06/service/user";
foreach( $dom->getElementsByTagNameNS ( $nsURI , 'hostPIN' ) as $node )
{
   echo $node->nodeValue.PHP_EOL;
}

Upvotes: 1

fusion3k
fusion3k

Reputation: 11689

This is a base example with DOMDocument:

$dom = new DOMDocument();
$dom->loadXML( $xmlString, LIBXML_NOBLANKS );
$nsURI = $dom->lookupNameSpaceUri( 'use' );
foreach( $dom->getElementsByTagNameNS ( $nsURI , 'hostPIN' ) as $node )
{
    echo $node->nodeValue.PHP_EOL;
}

If you will load xml from a file/url instead that from a string, use $dom->load instead of $dom->loadXML.

$node->nodeValue is the value that you want.

Please note:

In the example above, $dom->lookupNameSpaceUri( 'use' ) may not work, depending on where the namespace is declared. In this case, you can find by you the namespaceURI (it's declared somewhere in document as xmlns:use="http://example.com/someurl") and replace this line:

$nsURI = $dom->lookupNameSpaceUri( 'use' );

whit this:

$nsURI = "http://example.com/someurl";

Upvotes: 0

Related Questions