基于XML属性值的PHP If/Then

基于XML属性值的PHP If/Then,php,xml,xpath,simplexml,Php,Xml,Xpath,Simplexml,我有一个XML文件,作为SimpleXML元素读取。在该文件中,我有以下元素: <files> <file> <type>GIF</type> <url>http://dl.server.com/1.GIF</url> </file> <file> <type>JPG</type> <url>http://dl.serve

我有一个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>

GIF
http://dl.server.com/1.GIF
JPG
http://dl.server.com/2.JPG
TIF
http://dl.server.com/1.TIF
EPS
http://dl.server.com/1.EPS
LEPS
http://dl.server.com/2.EPS
我正在使用foreach()循环并基于元素的值执行操作。现在我需要查看所有文件->文件->类型值,如果“LEPS”存在,则使用该URL,否则如果“EPS”存在,则使用该URL,如果两者都不存在,则什么也不做

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


很抱歉提出这个基本问题!

您可以使用谓词检查
和同级文件/类型

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

例子: (出于趣味的考虑,本例使用的是而不是SimpleXML。xpath表达式本身是不可知的,可以在这两种语言中同样应用。)

/*$xml=您的xml字符串*/
$dom=新的DOMDocument();
$dom->loadXML($xml);
$xpath=newdomxpath($dom);

$query=您可以使用谓词检查
和同级文件/类型

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

例子: (出于趣味的考虑,本例使用的是而不是SimpleXML。xpath表达式本身是不可知的,可以在这两种语言中同样应用。)

/*$xml=您的xml字符串*/
$dom=新的DOMDocument();
$dom->loadXML($xml);
$xpath=newdomxpath($dom);

$query=在basic pseudo中,您可以在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

在basicpseudo中,您可以在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

是否有一个顺序,你想在其中使用它们?首先是LEPS,然后是EPS,然后是JPG,等等?目前是LEPS第一,EPS第二,没有第三。如果项目需要更改,我相信一旦我掌握了基本逻辑,我就可以适应。谢谢!是否有一个顺序,你想在其中使用它们?首先是LEPS,然后是EPS,然后是JPG,etc?目前它是LEPS第一,EPS第二,不是第三。如果项目需要更改,我相信一旦我掌握了基本逻辑,我就可以进行调整。谢谢!将该查询拟合到我的代码中的工作-将在今晚报告。不过,用解析器对其进行了测试,我知道它是如何工作的。谢谢!将该查询拟合到我的代码中的工作-将在今晚报告。不过用解析器测试了一下,我知道它是如何工作的。谢谢!