PHP If/Then 基于 XML 属性 值
PHP If/Then based on XML Property Values
我有一个 XML 文件,我正在将其作为简单XML 元素读取。在该文件中,我有以下元素:
<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 node/element/property 术语,无法找到查询 files->file->type = "LEPS" 是否为真或假的方法。虽然我知道如何检查属性 (isset(element['attributename']),但我不确定如何检查具有特定 属性 值的元素。
抱歉,这个问题很初级!
您可以使用谓词来检查 <type>
和兄弟 file/types 的那些。
//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>
在基本的伪代码中,您可以在 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
我有一个 XML 文件,我正在将其作为简单XML 元素读取。在该文件中,我有以下元素:
<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 node/element/property 术语,无法找到查询 files->file->type = "LEPS" 是否为真或假的方法。虽然我知道如何检查属性 (isset(element['attributename']),但我不确定如何检查具有特定 属性 值的元素。
抱歉,这个问题很初级!
您可以使用谓词来检查 <type>
和兄弟 file/types 的那些。
//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>
在基本的伪代码中,您可以在 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