diff --git a/lib/SAML2/Assertion.php b/lib/SAML2/Assertion.php
index b35e5d6c2b7b75bf5f318dd9e174a68864b1ea0f..d987fb0b98b91e2ad04a5a1c9980b5566040e7d7 100644
--- a/lib/SAML2/Assertion.php
+++ b/lib/SAML2/Assertion.php
@@ -321,7 +321,7 @@ class SAML2_Assertion implements SAML2_SignedElement {
 			}
 			switch ($node->localName) {
 			case 'AudienceRestriction':
-				$audiences = SAML2_Utils::extractStrings($node, './saml_assertion:Audience');
+				$audiences = SAML2_Utils::extractStrings($node, SAML2_Const::NS_SAML, 'Audience');
 				if ($this->validAudiences === NULL) {
 					/* The first (and probably last) AudienceRestriction element. */
 					$this->validAudiences = $audiences;
@@ -401,7 +401,7 @@ class SAML2_Assertion implements SAML2_SignedElement {
 			$this->authnContext = trim($accr[0]->textContent);
 		}
 		
-		$this->AuthenticatingAuthority = SAML2_Utils::extractStrings($ac, './saml_assertion:AuthenticatingAuthority');		
+		$this->AuthenticatingAuthority = SAML2_Utils::extractStrings($ac, SAML2_Const::NS_SAML, 'AuthenticatingAuthority');
 	}
 
 
diff --git a/lib/SAML2/Utils.php b/lib/SAML2/Utils.php
index d95243461e20f61dcff3804df6a9a087e3a48f72..0e37acc71988b4daf709e818c8fdf23b1bf108df 100644
--- a/lib/SAML2/Utils.php
+++ b/lib/SAML2/Utils.php
@@ -458,15 +458,20 @@ class SAML2_Utils {
 	/**
 	 * Extract strings from a set of nodes.
 	 *
-	 * @param DOMElement $parent  The element we should rund the XPath query on.
-	 * @param string $query  The XPath query we should use to retrieve the nodes.
+	 * @param DOMElement $parent  The element that contains the localized strings.
+	 * @param string $namespaceURI  The namespace URI the string elements should have.
+	 * @param string $localName  The localName of the string elements.
 	 * @return array  The string values of the various nodes.
 	 */
-	public static function extractStrings(DOMElement $parent, $query) {
-		assert('is_string($query)');
+	public static function extractStrings(DOMElement $parent, $namespaceURI, $localName) {
+		assert('is_string($namespaceURI)');
+		assert('is_string($localName)');
 
 		$ret = array();
-		foreach (self::xpQuery($parent, $query) as $node) {
+		for ($node = $parent->firstChild; $node !== NULL; $node = $node->nextSibling) {
+			if ($node->namespaceURI !== $namespaceURI || $node->localName !== $localName) {
+				continue;
+			}
 			$ret[] = trim($node->textContent);
 		}
 
diff --git a/lib/SAML2/XML/md/AffiliationDescriptor.php b/lib/SAML2/XML/md/AffiliationDescriptor.php
index ad333230586705a347f589e6a807aff0cde20de0..927ad1f8387de3f75e285e4fd83548cc3181b316 100644
--- a/lib/SAML2/XML/md/AffiliationDescriptor.php
+++ b/lib/SAML2/XML/md/AffiliationDescriptor.php
@@ -102,7 +102,7 @@ class SAML2_XML_md_AffiliationDescriptor extends SAML2_SignedElementHelper {
 
 		$this->Extensions = SAML2_XML_md_Extensions::getList($xml);
 
-		$this->AffiliateMember = SAML2_Utils::extractStrings($xml, './saml_metadata:AffiliateMember');
+		$this->AffiliateMember = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'AffiliateMember');
 		if (empty($this->AffiliateMember)) {
 			throw new Exception('Missing AffiliateMember in AffiliationDescriptor.');
 		}
diff --git a/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php b/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php
index bbf95075052bf02789a19bf12a0f719471e6dd82..8babb283abe6d47150564c4f25f41b63c01872fe 100644
--- a/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php
+++ b/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php
@@ -81,9 +81,9 @@ class SAML2_XML_md_AttributeAuthorityDescriptor extends SAML2_XML_md_RoleDescrip
 			$this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs);
 		}
 
-		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, './saml_metadata:NameIDFormat');
+		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat');
 
-		$this->AttributeProfile = SAML2_Utils::extractStrings($xml, './saml_metadata:AttributeProfile');
+		$this->AttributeProfile = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'AttributeProfile');
 
 		foreach (SAML2_Utils::xpQuery($xml, './saml_assertion:Attribute') as $a) {
 			$this->Attribute[] = new SAML2_XML_saml_Attribute($a);
diff --git a/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php b/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php
index 9a059823fcc3bd1ebef1b4915c604abdf80afcd8..8ab4c88c0811050c6ba5092000088a8e2850d223 100644
--- a/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php
+++ b/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php
@@ -61,7 +61,7 @@ class SAML2_XML_md_AuthnAuthorityDescriptor extends SAML2_XML_md_RoleDescriptor
 			$this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs);
 		}
 
-		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, './saml_metadata:NameIDFormat');
+		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat');
 	}
 
 
diff --git a/lib/SAML2/XML/md/IDPSSODescriptor.php b/lib/SAML2/XML/md/IDPSSODescriptor.php
index 67116ced880851378fa257bf891bf01dfb9cc20a..99190fa2e8c1738b3644e6f2347bab597c8f398e 100644
--- a/lib/SAML2/XML/md/IDPSSODescriptor.php
+++ b/lib/SAML2/XML/md/IDPSSODescriptor.php
@@ -92,7 +92,7 @@ class SAML2_XML_md_IDPSSODescriptor extends SAML2_XML_md_SSODescriptorType {
 			$this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs);
 		}
 
-		$this->AttributeProfile = SAML2_Utils::extractStrings($xml, './saml_metadata:AttributeProfile');
+		$this->AttributeProfile = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'AttributeProfile');
 
 		foreach (SAML2_Utils::xpQuery($xml, './saml_assertion:Attribute') as $a) {
 			$this->Attribute[] = new SAML2_XML_saml_Attribute($a);
diff --git a/lib/SAML2/XML/md/PDPDescriptor.php b/lib/SAML2/XML/md/PDPDescriptor.php
index e2765fdea3f76e0bbf2e9e2a7e788c8cab1fe8aa..677d5f64ff9067908871cc8b54a2b40129db6c90 100644
--- a/lib/SAML2/XML/md/PDPDescriptor.php
+++ b/lib/SAML2/XML/md/PDPDescriptor.php
@@ -61,7 +61,7 @@ class SAML2_XML_md_PDPDescriptor extends SAML2_XML_md_RoleDescriptor {
 			$this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs);
 		}
 
-		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, './saml_metadata:NameIDFormat');
+		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat');
 	}
 
 
diff --git a/lib/SAML2/XML/md/SSODescriptorType.php b/lib/SAML2/XML/md/SSODescriptorType.php
index 4ba5f5a5777076098b2dd53f57d9da33bc348766..bdb8e965ff69b5d2550e632463bce734e6d3fe9c 100644
--- a/lib/SAML2/XML/md/SSODescriptorType.php
+++ b/lib/SAML2/XML/md/SSODescriptorType.php
@@ -75,7 +75,7 @@ abstract class SAML2_XML_md_SSODescriptorType extends SAML2_XML_md_RoleDescripto
 			$this->ManageNameIDService[] = new SAML2_XML_md_EndpointType($ep);
 		}
 
-		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, './saml_metadata:NameIDFormat');
+		$this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat');
 	}