【问题标题】:PHP If/Then based on XML Property ValuesPHP If/Then 基于 XML 属性值
【发布时间】:2015-01-14 18:53:54
【问题描述】:

我有一个 XML 文件,我正在将其作为 SimpleXML 元素读取。在该文件中,我有以下元素:

<files>
  <file>
    <type>GIF</type>
    <url>http://dl.server.com/1.GIF</url>
  </file>
  <file>
    <type>JPG</type>
    <url>http://dl.server.com/2.JPG</url>
  </file>
  <file>
    <type>TIF</type>
    <url>http://dl.server.com/1.TIF</url>
  </file>
  <file>
    <type>EPS</type>
    <url>http://dl.server.com/1.EPS</url>
  </file>
  <file>
    <type>LEPS</type>
    <url>http://dl.server.com/2.EPS</url>
  </file>
</files>

我正在使用 foreach() 循环并根据元素的值执行操作。现在我需要查看所有文件->文件->类型值,如果“LEPS”存在,则使用该 URL,否则如果“EPS”存在,则使用该 URL,如果都不存在,则不执行任何操作。

我的难题在于 XML 节点/元素/属性术语,无法找到查询 files->file->type = "LEPS" 是否为真的方法。虽然我知道如何检查属性 (isset(element['attributename']),但我不确定如何检查具有特定属性值的元素。

对不起,这个基本问题!

【问题讨论】:

  • 有您想要使用它们的订单吗?首先是 LEPS,然后是 EPS,然后是 JPG,等等?
  • 目前是 LEPS 第一,EPS 第二,没有第三。如果项目需要更改,我相信一旦我掌握了基本逻辑,我就可以适应。谢谢!

标签: php xml xpath simplexml


【解决方案1】:

您可以使用谓词来检查&lt;type&gt; 以及同级文件/类型的谓词。

//files/file
[
    type='LEPS' or
    type='EPS' and not(
        following-sibling::file/type='LEPS' or
        preceding-sibling::file/type='LEPS'
    )
]/url

示例:

(这个例子使用 DOM extension 而不是 SimpleXML 是出于口味的原因。xpath 表达式本身是不可知的,并且可以同等地应用在任何一个中。)

/* $xml = your xml string */

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

$query = <<<'XPATH'
//files/file
[
    type='LEPS' or
    type='EPS' and not(
        following-sibling::file/type='LEPS' or
        preceding-sibling::file/type='LEPS'
    )
]/url
XPATH;

foreach ($xpath->query($query) as $node) {
    echo $dom->saveXML($node), "\n";
}

输出:

<url>http://dl.server.com/2.EPS</url>

【讨论】:

  • 正在努力将该查询拟合到我的代码中 - 今晚将报告。虽然用解析器对其进行了测试,但我看到了它是如何工作的。谢谢!
【解决方案2】:

在基本伪中,您可以在 foreach 中检查您的类型,如果匹配,则存储 url 供以后使用并跳出循环。

类似的东西

url = null
foreach node in element:
    if node->type == 'LEPS':
        url = node->url
        break
    else if node->type == 'EPS':
        url = node->url

// if url is null, no result found

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多