Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取节点等于的所有同级节点。。。使用xpath和命名空间_Php_Xml_Xpath_Simplexml - Fatal编程技术网

Php 获取节点等于的所有同级节点。。。使用xpath和命名空间

Php 获取节点等于的所有同级节点。。。使用xpath和命名空间,php,xml,xpath,simplexml,Php,Xml,Xpath,Simplexml,我使用xpath从epg文件中查找内容,但对于这个源代码,我的代码根本无法工作。现在我已经到了我自己解决不了的地步。 XML如下所示(如您所见,有两个名称空间,v3和v31) 我也试过了 $parent = $this->xmldata->xpath('//v31:event/v31:contentIdRef[.="content.1375706-006"]/parent::*/child::*'); 但是,第一个选项(使用print_r)返回v31:event“timestamp

我使用xpath从epg文件中查找内容,但对于这个源代码,我的代码根本无法工作。现在我已经到了我自己解决不了的地步。 XML如下所示(如您所见,有两个名称空间,v3和v31)

我也试过了

$parent = $this->xmldata->xpath('//v31:event/v31:contentIdRef[.="content.1375706-006"]/parent::*/child::*');
但是,第一个选项(使用print_r)返回v31:event“timestamp”

第二种选择返回11个空的“simpleXMLobjects”(为什么它们是空的??),因此基于对象的数量,我认为我已经“击中了要害”,但我无法找出它们为什么是空的

是的,我在我的代码中注册了名称空间(我希望这么简单)

TLDR; 我想要一个。从第一个块(v3:contentList)获取所有ContentID, 2.获取每个contentId的所有eventdata, 3.获取每个内容id的所有materialdata


我真诚地希望您能提供帮助:/

您是否在Xpath表达式中为名称空间注册了前缀?始终为正在使用的名称空间注册自己的前缀。默认情况下,PHP注册当前上下文节点的命名空间定义。但这可能会在文档中的任何元素节点上更改,并且并非所有前缀都可以在文档元素上定义

$schedule = new SimpleXMLElement($xml);
$schedule->registerXpathNamespace('s', 'http://common.tv.se/schedule/v3_1');
$schedule->registerXpathNamespace('e', 'http://common.tv.se/event/v3_1');

$events = $schedule->xpath(
  '//e:event[e:contentIdRef = "content.1375706-006"]'
);

foreach ($events as $event) {
  echo $event->asXml(), "\n\n";
}
或使用DOM:

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('s', 'http://common.tv.se/schedule/v3_1');
$xpath->registerNamespace('e', 'http://common.tv.se/event/v3_1');

$events = $xpath->evaluate('//e:event');
foreach ($events as $event) {
  echo $document->saveXml($event), "\n\n";
}

您是否在Xpath表达式中注册了名称空间的前缀?始终为正在使用的名称空间注册自己的前缀。默认情况下,PHP注册当前上下文节点的命名空间定义。但这可能会在文档中的任何元素节点上更改,并且并非所有前缀都可以在文档元素上定义

$schedule = new SimpleXMLElement($xml);
$schedule->registerXpathNamespace('s', 'http://common.tv.se/schedule/v3_1');
$schedule->registerXpathNamespace('e', 'http://common.tv.se/event/v3_1');

$events = $schedule->xpath(
  '//e:event[e:contentIdRef = "content.1375706-006"]'
);

foreach ($events as $event) {
  echo $event->asXml(), "\n\n";
}
或使用DOM:

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('s', 'http://common.tv.se/schedule/v3_1');
$xpath->registerNamespace('e', 'http://common.tv.se/event/v3_1');

$events = $xpath->evaluate('//e:event');
foreach ($events as $event) {
  echo $document->saveXml($event), "\n\n";
}

您好,是的,我在$parent之前注册了它们,比如$this->xmldata->registerXpathNamespace.:/您好,是的,我在$parent之前注册了它们,比如$this->xmldata->registerXpathNamespace.:/