Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

XPath кто разумит? Чертов NS....

12
24 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Имеет XML (prise.xml) файл:
Код:
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>А</Author>
  <LastAuthor>admin</LastAuthor>
  <Created>2006-08-06T15:51:34Z</Created>
  <html:LastSaved>2006-08-10T07:22:57Z</html:LastSaved>
  <Company>Д</Company>
  <Version>11.5606</Version>
 </DocumentProperties>
</Workbook>

Имеем код:
 
Код:
<?php
$doc = new DOMDocument();
$doc->load('prise.xml');
$XPath = new DOMXPath($doc);
$path = '/Workbook/DocumentProperties/*';
$NodeList = $XPath->query($path);
?>

В $NodeList получаю пустой набор узлов. Если в исходном XML убрать NS все работает как нужно, в $NodeList наборе 6 узлов.

В чем ошибка составления выражения??? Я понимаю, если бы был префикс для элементов, но нет, префик NULL. 4 час уже объюсь и ни каких идей уже нет :mad:
337
25 апреля 2007 года
shine
719 / / 09.06.2006
А так:
 
Код:
$path = '/html:Workbook/o:DocumentProperties/*';

Вобщем имхо в xpath тоже нужно использовать namespace.
300
25 апреля 2007 года
ReDrum
689 / / 20.04.2000
 
Код:
/*[local-name()='Workbook' and namespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']/*[local-name()='DocumentProperties' and namespace-uri()='urn:schemas-microsoft-com:office:office'][1]


Приблизительно вот так :)=
12
25 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: shine
А так:
 
Код:
$path = '/html:Workbook/o:DocumentProperties/*';

Вобщем имхо в xpath тоже нужно использовать namespace.


Хм... агде это у меня ты видишь html?

12
25 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: ReDrum

Приблизительно вот так :)=


А ха ха! Через предикаты ))) а я и не догадался. С ходу воткнул, вроде работает! А уже было отчаялся ибо нарыл тут:

Цитата:

It is mentioned in a few places on the web, but it wasn't mentioned here. You need to use this function to set up a prefix for the default namespace of a document.

For instance, if you are trying to parse a Microsoft Spreadsheet XML file, which has the default namespace of "urn:schemas-microsoft-com:office:spreadsheet":

$doc = DOMDocument::load("my_spreadsheet.xml);
$xpath = new DOMXPath($doc);
$xpath->registerNamespace("m",
"urn:schemas-microsoft-com:office:spreadsheet");
$query = '/m:Workbook/m:Worksheet[1]/m:Table';
$result = $xpath->query($query, $doc);

You can use anything in place of the 'm', but you have to specify something! Just asking for "/Workbook/Worksheet/Table" doesn't work.


Так что как ни жаль, видимо registerNamespace работает еще не так безупречно, как бы хотелось. И значит придется писать огромные XPath выражения с предикатами...

12
25 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Респект ReDrum! Сейчас поюзал, как раз то, что доктор прописал! Не думал, что у нас тут есть эсперты по XPath выражениям, если честно :D . Видимо потому что данная область редко всплывает на форме.
337
25 апреля 2007 года
shine
719 / / 09.06.2006
Цитата: alekciy
Хм... агде это у меня ты видишь html?



xmlns:html в тэге Workbook

12
26 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: shine
xmlns:html в тэге Workbook


Ах ты про это... Неее... то префикс, это не то. У Workbook префикса с данному случае вообще нет. (См. спецу "Namespaces in XML".) В том собственна и была трудность.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог