php xpath запрос xml для сопоставления значения - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь использовать 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 ]

2 голосов
/ 31 января 2012

Это даст вам соответствующее <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> имели идентификатор 10, он бы проверил их все.

0 голосов
/ 31 января 2012

Вы также можете выполнить это с помощью навигации вместо условия вложенного предиката:

/records/record/f[@id=10 and text()='user1@example.com']/..

Это говорит: «перейдите вниз к f s, найдите узел адреса электронной почты, соответствующий этому условию, затем получите родительский узел (который record)». Оттуда вы можете перейти к определенному f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...