XPath не соответствует атрибутам без пространства имен в качестве префикса - PullRequest
4 голосов
/ 02 августа 2011

В настоящее время я пытаюсь прочитать различные файлы install.rdf расширений Firefox через PHP SimpleXML.

К сожалению, нет предопределенной структуры, как они должны выглядеть.Они всегда используют два пространства имен: «http://www.w3.org/1999/02/22-rdf-syntax-ns#"» и «http://www.mozilla.org/2004/em-rdf#".

». Поэтому я хотел использовать XPath для получения элементов, представляющих интерес:

$xml = simplexml_load_string($installRDF);
$namespaces = $xml->getNameSpaces(true);
$xml->registerXPathNamespace('rdf', NS_RDF);
$main = $xml->xpath('/rdf:RDF/rdf:Description[@rdf:about="urn:mozilla:install-manifest"]');

НоКажется, существует проблема с префиксом rdf атрибута about, поскольку он просто возвращает результат, если в файле RDF также определен префикс.

Так что для этого он работает:

<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <RDF:Description RDF:about="urn:mozilla:install-manifest">
    <em:id>extension@mozilla.org</em:id>
  </RDF:Description>
</RDF:RDF>

Но для этого нет:

<RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
     xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>extension@mozilla.org</em:id>
  </Description>
</RDF>

Для меня это выглядит как ошибка в PHP, поскольку, если я удаляю атрибут из XPath, я всегда получаю элементы Description,Но я еще не знаю об использовании пространств имен в XPath, поэтому я спрашиваю здесь.

1 Ответ

1 голос
/ 02 августа 2011

Проблема в том, что атрибуты во втором примере находятся в пустом пространстве имен. Проблема не в запросе, но данные XML ваших двух примеров не эквивалентны.

См. Пространства имен в XML 1.0 (третье издание) :

Объявление пространства имен по умолчанию применяется ко всем элементам без префиксов. имена в пределах своей области. Декларации пространства имен по умолчанию не применяются непосредственно к именам атрибутов; интерпретация без префикса Атрибуты определяются элементом, на котором они появляются.

...