PHP& XPath查询

时间:2017-04-12 18:17:37

标签: php xpath

我有一个类似于以下文本的XML文件:

dos2unix

我正在使用此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>

如果符合条件,我该如何处理“TypesDay”条目?

我希望不要创造重复......我会疯狂几个小时,这肯定是一件小事。

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。首先,您应该注册名称空间:

$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"
  }
}