<?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>
XPath кто разумит? Чертов NS....
Код:
Имеем код:
Код:
<?php
$doc = new DOMDocument();
$doc->load('prise.xml');
$XPath = new DOMXPath($doc);
$path = '/Workbook/DocumentProperties/*';
$NodeList = $XPath->query($path);
?>
$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:
Код:
$path = '/html:Workbook/o:DocumentProperties/*';
Вобщем имхо в xpath тоже нужно использовать namespace.
Код:
/*[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]
Приблизительно вот так :)=
Цитата: shine
А так:
Вобщем имхо в xpath тоже нужно использовать namespace.
Код:
$path = '/html:Workbook/o:DocumentProperties/*';
Вобщем имхо в xpath тоже нужно использовать namespace.
Хм... агде это у меня ты видишь html?
Цитата: 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 выражения с предикатами...
Респект ReDrum! Сейчас поюзал, как раз то, что доктор прописал! Не думал, что у нас тут есть эсперты по XPath выражениям, если честно :D . Видимо потому что данная область редко всплывает на форме.
Цитата: alekciy
Хм... агде это у меня ты видишь html?
xmlns:html в тэге Workbook
Цитата: shine
xmlns:html в тэге Workbook
Ах ты про это... Неее... то префикс, это не то. У Workbook префикса с данному случае вообще нет. (См. спецу "Namespaces in XML".) В том собственна и была трудность.