2012-08-07 15 views
5

: (bir epub kitapta standart container.xml var)Kayıt ol PHP'nin DOMXPath'ında gerekli alan mı? Böyle bir XML ile çalışıyorum

<?xml version="1.0"?> 
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container"> 
    <rootfiles> 
     <rootfile full-path="OEBPS/9780765348210.opf" media-type="application/oebps-package+xml"/> 
    </rootfiles> 
</container> 

PHP kullanarak bunu ayrıştırmak çalışıyorum. Bu benim kod şimdiye kadar geçerli:

$c = new DOMDocument(); 
$c->load($filename); 
$x = new DOMXPath($c); 
//fine up to here! 

//is this even what I'm supposed to be doing? 
$x->registerNamespace('epub', 'urn:oasis:names:tc:opendocument:xmlns:container'); 
$root = $x->query('/epub:container/epub:rootfiles/epub:rootfile'); 

//fine down from here! 
$opf = $root->item(0)->getAttribute('full-path'); //I know I should check if the element's there and if it has the attribute. Not important. 

Sorum şu: olduğunu registerNamespace çağrıyı yapmak değil bir yolu var mı? Farklı epubların bu değeri biraz farklı olarak ayarlayıp ayarlamadığından emin değilim ve bu koda ihtiyacım var.

cevap

2

AFAIK: no. XML belgeleri isim çarpışmalarından muzdarip olabilir, bu nedenle ad alanları kullanılır. Bir veya daha fazla ad alanı kaydetmeden ve bunlar için önekler ayarlamadan, XML belgelerinde XPath kullanamazsınız.

Örneğinizde XML varsayılan bir ad alanı (xmlns="<namespace identifier>") bildiriyor, bu durumda bir veya daha fazla ad alanı öneki olmayan tüm öğeler varsayılan ad alanının altına düşecektir. Bu varsayılan ad alanında olduğunu bildiğiniz sürece biraz daha kolay bir şey vardır: bunun yerine, varsayılan ad alanını sabit kodlamak ve bunu şu şekilde almak için değil:

// ... load the DOMDocument ... 

$defaultNamespace = $c->lookupNamespaceURI($c->namespaceURI); 
$x->registerNamespace('epub', $defaultNamespace); 

// ... now query like in your example 
$root = $x->query('/epub:container/epub:rootfiles/epub:rootfile'); 
İlgili konular