PHP SimpleXML: neden xpath durdurma çalışma nedir?

1 Cevap php

Bir tedarikçi XML biraz header değişti sonra tuhaf bir şey oldu. Ben XPath kullanarak bir şeyler okuyabilmek için kullanılan, ama şimdi ben bile bir cevap alınamıyor

$xml->xpath('/');

Onlar bu onu değiştirdi ...

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE NewsML SYSTEM "http://www.newsml.org/dl.php?fn=NewsML/1.2/specification/NewsML_1.2.dtd" [
<!ENTITY % nitf SYSTEM "http://www.nitf.org/IPTC/NITF/3.4/specification/dtd/nitf-3-4.dtd">
%nitf;
]>
<NewsML>
...

Bunun için:

<?xml version="1.0" encoding="iso-8859-1"?>
<NewsML
  xmlns="http://iptc.org/std/NewsML/2003-10-10/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://iptc.org/std/NewsML/2003-10-10/ http://www.iptc.org/std/NewsML/1.2/specification/NewsML_1.2.xsd http://iptc.org/std/NITF/2006-10-18/   http://contentdienst.pressetext.com/misc/nitf-3-4.xsd"
>
...

1 Cevap

Onların belgeye varsayılan bir ad alanı (xmlns="http://iptc.org/std/NewsML/2003-10-10/") tanıttı ettik, çünkü büyük olasılıkla bu. Varsayılan ad alanları için SimpleXML destek hafif deyimiyle, çok iyi değil.

Açıkça bir ad öneki kayıt deneyebilirsiniz:

$xml->registerXPathNamespace("n", "http://iptc.org/std/NewsML/2003-10-10/");
$xml->xpath('/n:NewsML');

Sen every elemanı üzerinde "n:" öneki kullanmak için XPath ifadeleri uyarlamak gerekir. İşte bazı ek info: http://people.ischool.berkeley.edu/~felix/xml/php-and-xmlns.html.

EDIT: başı olarak the spec:

[registerXPathNamespace() function] Sonraki XPath ifadesi için bir önek / ns bağlamı oluşturur.

Bu XPath sorguları yapmak için doğal bir şey olacağını sarmak için bir fonksiyon, böylece her XPath sorgusu önce çağrılacak olması anlamına geliyor.