我正在尝试使用xpath在以下XML中查询特定的电子邮件地址。
<?xml version="1.0"?>
<records>
<record>
<f id="6">sample data 1</f>
<f id="7">user full name 1</f>
<f id="8">first name 1</f>
<f id="9">phone number 1</f>
<f id="10">user1@example.com</f>
<f id="11">user1 last name</f>
<f id="12">url 1</f>
</record>
<record>
<f id="6">sample data 2</f>
<f id="7">user full name 2</f>
<f id="8">first name 2</f>
<f id="9">phone number 2</f>
<f id="10">user2@example.com</f>
<f id="11">user2 last name</f>
<f id="12">url 2</f>
</record>
<record>
<f id="6">sample data 3</f>
<f id="7">user full name 3</f>
<f id="8">first name 3</f>
<f id="9">phone number 3</f>
<f id="10">user3@example.com</f>
<f id="11">user3 last name</f>
<f id="12">url 3</f>
</record>
</records>
我正在使用PHP,到目前为止,我可以通过以下行查询所有电子邮件地址。
$result = $xml->xpath('/records/record/f[@id="10"]');
但是,我希望能够查询特定的电子邮件地址,例如“user2@example.com”。可以用xpath在一行中完成吗?
另外,我需要根据该电子邮件地址返回XML中的一些其他值。
例如,我查询XML“user2@example.com”,然后返回“用户全名2”,“样本数据2”等。
任何帮助将不胜感激!我对xpath比较陌生,在试图查看W3C学校的例子后,我的篇幅很短。
答案 0 :(得分:2)
这会为您提供相应的<record>
:
$xml->xpath('/records/record[f[@id="10"] = "user2@example.com"]');
请注意,谓词可以嵌套。
更有趣的是,这也会给你各自的<record>
$xml->xpath('/records/record[f = "user2@example.com"]');
这是有效的,因为XPath =
运算符将所有匹配节点与右侧值进行比较。您可以将其视为“...其中任何<f>
的值为'user2@example.com'.
”。
因此,第一个表达式如下所示:“...其中<f>
@id
10
的任何'user2@example.com'.
的值为<f>
” ,即如果多个{{1}}元素的ID为10,则会检查所有元素。
答案 1 :(得分:0)
您也可以使用导航而不是嵌套谓词条件来完成此操作:
/records/record/f[@id=10 and text()='user1@example.com']/..
这说,“向下导航到f
,找到符合此条件的电子邮件地址节点,然后获取节点的父节点(record
)。”从那里,您可以向下导航到特定的f。