php xpath查询xml的匹配值

时间:2012-01-31 14:45:38

标签: php xml xpath

我正在尝试使用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学校的例子后,我的篇幅很短。

2 个答案:

答案 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。