PHP kullanarak XML ad kaldır

3 Cevap php

Şöyle bir XML belgesi var:

<Data 
  xmlns="http://www.domain.com/schema/data" 
  xmlns:dmd="http://www.domain.com/schema/data-metadata"
>
  <Something>...</Something>
</Data>

Ben PHP SimpleXML kullanarak bilgiyi ayrıştırma ediyorum. Ben dizileri ile uğraşıyorum ve ben ad ile ilgili bir sorun yaşıyor gibisin.

Benim soru: Nasıl bu ad kaldırırım? Ben bir XML dosyasından veri okumak.

Teşekkür ederiz!

3 Cevap

XPath kullanıyorsanız o XPath ve xpath and default namespaces daha fazla bilgi için bu açıklama da not PHP görünüme sahip bir sınırlama var.

Soruna neden olan kök düğüm özellikle onun xmlns="" özellik. Bu ad daha sonra unsurları ifade etmek için bundan sonra QName kullanmak kayıt gerekir demektir.

$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");

Important: registerXPathNamespace çağrısı kullanılan URI gerçek XML dosyasında kullanılan bir aynı olmalıdır.

Ad kaldırmak için tamamen o bir RegularExpression gibi xml dizesi kullanmanız gerekir:

$feed = file_get_contents("http://www.sitepoint.com/recent.rdf");
$feed = preg_replace("/<.*(xmlns *= *[\"'].[^\"']*[\"']).[^>]*>/i", "", $feed); // This removes ALL default namespaces.
$xml_feed = simplexml_load_string($feed);

Eğer (aracılığıyla regex ile dikkatli XML yüklemeden önce daha sonra herhangi bir xml ad elimden ettik çünkü böyle bir şey ile herhangi bir alan varsa:

<![CDATA[ <Transfer xmlns="http://redeux.example.com">cool.</Transfer /> ]]>

Sonra beklenmedik sonuçlara yol açabilir CDATA'da içindeki xmlns şerit olacak.

Aşağıdaki PHP kodu otomatik takma "varsayılan" altında XML dosyasında belirtilen varsayılan ad algılar. Hiçbir tüm XPath sorguları öneki eklemeniz güncellenmek zorunda default:

XML dosyalarını okumak istiyorsanız Yani bunun yerine bir varsayılan NS tanımını içeren ya da yok ve tüm Something elemanlarını sorgulamak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

$xml = simplexml_load_file($name);
$namespaces = $xml->getDocNamespaces();
if (isset($namespaces[''])) {
    $defaultNamespaceUrl = $namespaces[''];
    $xml->registerXPathNamespace('default', $defaultNamespaceUrl);
    $nsprefix = 'default:';
} else {
    $nsprefix = '';
}

$somethings = $xml->xpath('//'.$nsprefix.'Something');

echo count($somethings).' times found';