2017-04-12 75 views
0

我有类似下面的文本的XML文件:PHP和XPath查询

<?xml version="1.0" standalone="yes"?> 
<Calendar xmlns="urn:AvmInterchangeSchema-Calendario-1.0"> 
    <Date> 
    <Day>12/04/2017</Day> 
    <TypesDay> 
     <Type>Test 1</Type> 
     <Type>Test 2</Type> 
     <Type>Test 3</Type> 
    </TypesDay> 
    </Date> 
</Calendar> 

,我使用这个XPath来选择的节点:

$xml = simplexml_load_file("file.xml"); 
$response = $xml->xpath('//*[text()="'.date("d/m/Y").'"]'); 

我怎样才能把“TypesDay “条目是否满足?

我希望不要造成重复...我要疯了几个小时,它肯定是一件小事。

+1

https://eval.in/775280 – splash58

+0

感谢@ splash58,也是你的答案是非常有用的 –

回答

2

有几种方法可以做到这一点。

$xml->registerXPathNamespace('x', 'urn:AvmInterchangeSchema-Calendario-1.0'); 

我假设与价值12/04/2017节点名称可以改变:首先,要注册的命名空间。

首先

找到一个名为TypesDay命名的命名空间x父节点具有价值的子节点12/04/2017

$response = $xml->xpath('//*[*[text()="'.date("d/m/Y").'"]]/x:TypesDay'); 

内部节点找到一个名为节点TypesDay命名空间内x是节点的兄弟与价值12/04/2017

$response = $xml->xpath('//*[text()="'.date("d/m/Y").'"]/following-sibling::x:TypesDay'); 

两个结果是:

array(1) { 
    [0]=> 
    object(SimpleXMLElement)#2 (1) { 
    ["Type"]=> 
    array(3) { 
     [0]=> 
     string(6) "Test 1" 
     [1]=> 
     string(6) "Test 2" 
     [2]=> 
     string(6) "Test 3" 
    } 
    } 
} 

毕竟,如果你只想要的条目,只需添加一个新的水平/x:Type

$response = $xml->xpath('//*[*[text()="'.date("d/m/Y").'"]]/x:TypesDay/x:Type'); 

或者:

$response = $xml->xpath('//*[text()="'.date("d/m/Y").'"]/following-sibling::x:TypesDay/x:Type'); 

结果:

array(3) { 
    [0]=> 
    object(SimpleXMLElement)#3 (1) { 
    [0]=> 
    string(6) "Test 1" 
    } 
    [1]=> 
    object(SimpleXMLElement)#4 (1) { 
    [0]=> 
    string(6) "Test 2" 
    } 
    [2]=> 
    object(SimpleXMLElement)#5 (1) { 
    [0]=> 
    string(6) "Test 3" 
    } 
} 
+0

感谢您的答复,我也没有登记的命名空间,这是所有有机会看到。 感谢您的解释,我也可以检查文件中的TypesDay实际存在。 非常感谢。 –