簡體   English   中英

獲取節點等於...的所有兄弟節點 - 使用xpath和命名空間

[英]Get all siblings-nodes where node equals… with xpath and namespace

我使用xpath從epg文件中查找內容,但是對於這個源代碼,我的代碼根本不起作用。 現在我已經到了我自己無法解決的問題。 XML看起來像這樣(如您所見,2個名稱空間,v3和v31)。

<?xml version="1.0" encoding="UTF-8"?>
<v3:schedule timestamp="2017-05-12T16:11:06.595Z" xmlns:v3="http://common.tv.se/schedule/v3_1">
<v3:from>2017-05-12T22:00:00.000Z</v3:from>
<v3:to>2017-05-13T22:00:00.000Z</v3:to>
...
<v3:contentList>
<v31:content timestamp="2017-05-12T16:11:06.595Z" xmlns:v31="http://common.tv.se/content/v3_1">
  <v31:contentId>content.1375706-006</v31:contentId>
  <v31:seriesId>series.40542</v31:seriesId>
  <v31:seasonNumber>3</v31:seasonNumber>
  <v31:episodeNumber>6</v31:episodeNumber>
  <v31:numberOfEpisodes>8</v31:numberOfEpisodes>
  <v31:productionYear>2017</v31:productionYear>
  ...
  <v3:eventList>
  <v31:event timestamp="2017-05-12T16:11:06.595Z" xmlns:v31="http://common.tv.se/event/v3_1">
  <v31:eventId>event.26072881</v31:eventId>
  <v31:channelId>channel.24</v31:channelId>
  <v31:rerun>true</v31:rerun>
  <v31:live>false</v31:live>
  <v31:hidden>false</v31:hidden>
  <v31:description/>
  <v31:timeList>
    <v31:time type="public">
      <v31:startTime>2017-05-12T22:55:00.000Z</v31:startTime>
      <v31:endTime>2017-05-12T23:55:00.000Z</v31:endTime>
      <v31:duration>01:00:00:00</v31:duration>
    </v31:time>
  </v31:timeList>
  <v31:contentIdRef>content.1375706-006</v31:contentIdRef>
  <v31:materialIdRef>material.1010161108005267221</v31:materialIdRef>
  <v31:previousEventList/>
  <v31:comingEventList/>
  </v31:event>
  ...
  <v3:materialList>
  <v31:material timestamp="2017-05-12T16:11:06.595Z" xmlns:v31="http://common.tv.se/material/v3_1">
  <v31:materialId>material.1010161108005267221</v31:materialId>
  <v31:contentIdRef>content.1375706-006</v31:contentIdRef>
  <v31:materialType>tx</v31:materialType>
  <v31:videoFormat>576i</v31:videoFormat>
  <v31:audioList>
    <v31:format language="unknown">stereo</v31:format>
  </v31:audioList>
  <v31:aspectRatio>16:9</v31:aspectRatio>
  <v31:materialReferenceList>
  </v31:materialReferenceList>
  </v31:material>
...

而“contentIdRef”是將不同元素(事件和材料)保持在一起的原因。 我想找到所有數據,基於contentIdRef。

我用過這個(在php中):

$parent = $this->xmldata->xpath('//v31:event/v31:contentIdRef[.="content.1375706-006"]/parent::*')

我也嘗試過

$parent = $this->xmldata->xpath('//v31:event/v31:contentIdRef[.="content.1375706-006"]/parent::*/child::*');

但是,第一個替代方法(使用print_r)返回v31:event“timestamp”

第二個替代方案返回11個“simpleXMLobjects”,它們是空的(為什么它們是空的?),所以基於對象的數量,我認為我已經“到了現場”,但我無法找出它們為什么是空的。 ...

是的,我在我的代碼中注冊了名稱空間(我希望它很簡單)。

TLDR; 我想1.從第一個塊獲取所有contentIds(v3:contentList),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";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM