XPath в SimpleXML для пространств имен по умолчанию без префиксов

У меня есть документ XML, к которому прикреплено пространство имен по умолчанию, например


...

На самом деле это сложный XML-документ, соответствующий сложной схеме. Моя работа состоит в том, чтобы разобрать некоторые данные из этого. Чтобы помочь мне, у меня есть таблица XPath. XPath довольно глубоко вложен, например

level1/level2/level3[@foo="bar"]/level4[@foo="bar"]/level5/level6[2]

Человек, который генерирует XPath, является экспертом в схеме, поэтому я предполагаю, что могуt упростить его или использовать ярлыки обхода объекта.

я используюSimpleXML разобрать все Моя проблема связана с тем, как обрабатывается пространство имен по умолчанию.

Поскольку в корневом элементе есть пространство имен по умолчанию, я могупросто делай

$xml = simplexml_load_file($somepath);
$node = $xml->xpath('level1/level2/level3[@foo="bar"]/level4[@foo="bar"]/level5/level6[2]');

Мне пришлосьзарегистрировать пространство имен, назначьте его префиксу, а затем используйте префикс в моем XPath, например

$xml = simplexml_load_file($somepath);
$xml->registerXPathNamespace('myns', 'http://www.example.com/ns/1.0');
$node = $xml->xpath('myns:level1/myns:level2/myns:level3[@foo="bar"]/myns:level4[@foo="bar"]/myns:level5/myns:level6[2]');

Добавление префиксов isn 'не будет управляемым в долгосрочной перспективе.

Есть ли правильный способ обработки пространств имен по умолчанию без необходимости использовать префиксы с XPath?

Использование пустого префикса нет работа ($xml->registerXPathNamespace('', 'http://www.example.com/ns/1.0');). Я могу заштриховать пространство имен по умолчанию, например

$xml = file_get_contents($somepath);
$xml = str_replace('xmlns="http://www.example.com/ns/1.0"', '', $xml);
$xml = simplexml_load_string($xml);

но это обход вопроса.

Ответы на вопрос(3)

Ваш ответ на вопрос