2013-08-21 139 views
0

我正在使用Xpath解析一些XML文件。我想用一个表达式来选择一个特定的分类节点和他的父节点(Sport)?!PHP XPath - 用一条规则选择一个特定节点及其父节点

XML文档:livescore_full.xml

<? xml version = "1.0" encoding = "UTF-8" ?> 
<LivescoreData generatedAt="2013-08-18T09:41:19 CEST" type="full"> 
    <Sport SportId="1"> 
     <Name language="en">Soccer</Name> 
     <Category CategoryId="48"> 
      <Name language="en">Argentina</Name> 
      <Tournament TournamentId="68" UniqueTournamentId="155"> 
       <Name language="en">Primera Division, Torneo Inicial</Name> 
      </Tournament> 
     </Category> 
     <Category CategoryId="49"> 
      <Name language="en">Brazil</Name> 
      <Tournament TournamentId="69" UniqueTournamentId="156"> 
       <Name language="en">Brazil Primera Division</Name> 
      </Tournament> 
     </Category> 
    </Sport> 
    <Sport SportId="2"> 
     <Name language="en">Basketball</Name> 
     <Category CategoryId="55"> 
      <Name language="en">Spain</Name> 
      <Tournament TournamentId="545" UniqueTournamentId="453"> 
       <Name language="en">Primera Division, Torneo Inicial</Name> 
      </Tournament> 
     </Category> 
     <Category CategoryId="56"> 
      <Name language="en">England</Name> 
      <Tournament TournamentId="654" UniqueTournamentId="5656"> 
       <Name language="en">England</Name> 
      </Tournament> 
     </Category> 
    </Sport> 
</LivescoreData> 


$xml = simplexml_load_file("livescore_full.xml"); 
$data = $xml->xpath('//Category[@CategoryId="48"]'); 
print_r($data); // only return data for specific Category node 

$数据包含有关类别节点ID = 48的数据,但没有对这项运动的ID和体育名称信息。

如何编写Xpath规则以使用CategoryId属性选择运动和类别数据?我尝试了一些祖先或自我的变化,但没有成功。

回答

0
"/LiveScoreData/Sport[Category[@CategoryId='48']" 

会是一种方式。

+0

随着“/ LiveScoreData/Sport [Category [@ CategoryId = '48']]”返回空数组。使用“// Sport [Category [@IetId = '48']]”返回运动节点,并且两个类别节点(48 i 49)都被返回,但仅需要类别48。 并感谢您的及时答复。 – HeyHo

+1

Xpath选择节点,它不处理它们。一旦你有了它,你可以删除那些你不想要的ID –

0
该想到

一个简单的答案是(How do I select multiple nodesets):

$data = $xml->xpath('//Category[@CategoryId="48"] | //Sport[Category[@CategoryId="48"]]'); 

但是,我就把你的SimpleXML对于这种情况,并为此:

$dom = new DOMDocument(); 
$dom->load("livescore_full.xml"); 
$xpath = new DOMXPath($dom); 
$category = $xpath->query('//Category[@CategoryId="48"]')->item(0); 
//then sport is just it's parentNode: 
$sport = $category->parentNode; 

//removing all other cats: 
$dom = new DOMDocument(); 
$dom->load("livescore_full.xml"); 
$xpath = new DOMXPath($dom); 

$categories = $xpath->query('//Sport[Category[@CategoryId="48"]]/Category[@CategoryId!="48"]'); 
while($othercat = $categories->item(0)){ 
    $othercat->parentNode->removeChild($othercat); 
} 
+0

选择多个节点不是我要找的解决方案。 我试图让导致这样的(在结构对象的数组): '<体育SportId = “1”> <名称语言= “EN”>足球 <类别类别ID = “48” > <名称语言= “EN”>阿根廷 <锦标赛TournamentId = “68” UniqueTournamentId = “155”> <名称语言= “EN”>西甲,TORNEO Inicial ' 谢谢您的回答。 – HeyHo

+0

所以,用文字_“我想选择一个特定的类别节点和他的父节点(运动)用一个表达式”_你的意思是_“我想要一个体育节点只有一个类别”_...这是一个完全不同的东西。来吧... – Wrikken

+0

是的,那是真的,对不起。但是我不知道SportId,选择节点时只有CategoryId。 – HeyHo

相关问题