Php 获取节点等于的所有同级节点。。。使用xpath和命名空间
我使用xpath从epg文件中查找内容,但对于这个源代码,我的代码根本无法工作。现在我已经到了我自己解决不了的地步。 XML如下所示(如您所见,有两个名称空间,v3和v31) 我也试过了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
$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.:/