Задать вопрос
@Angelxalfa

Как правильно пропарсить XML через Xpath?

Добрый день! Есть xml вида:
<street street="улица1">
    <house house="1">
      <appartment appartment="1"/>
      <appartment appartment="2"/>
      <appartment appartment="4"/>
    </house>
    <house house="8">
      <appartment appartment="1"/>
      <appartment appartment="2"/>
      </house>
     </street >
<street street="улица2">
    <house house="1">
      <appartment appartment="1"/>
      <appartment appartment="2"/>
      <appartment appartment="4"/>
    </house>
    <house house="8">
      <appartment appartment="1"/>
      <appartment appartment="2"/>
      </house>
     </street >


Мне нужно выбрать квартиры только в определенном доме на определенной улице (в реальном XML сотни улиц и тысячи домов).
Дома на определенной улице выбираю через xpath, полученное пропускаю через цикл и получаю дома

$xml = simplexml_load_file('file.xml');
						$names = $xml->xpath("//street[@street='".$street."']");
						foreach($names as $street) {
							foreach($street->house as $house) {
								$house_num = $house[house];
								echo '<option value="' . $house_num . '">' . $house_num . '</option>'; 
							}


Вопрос. Как сделать тоже самое для квартир. Если в этот же цикл вставить перебор по квартирам - будут повторяться одни и те же квартиры по кол-ву выбранных xpath домов. Можно ли через x-path выбрать дом, где атрибут = чему-то, который находтся в теге улица, где атрибут = чему-то....
Что-то типа
$xml->xpath("//house[@house='".$house."' AND ../street[@street='".$street."']]");


Заранее спасибо!
  • Вопрос задан
  • 439 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@throughtheether
human after all
Не вполне ясно, что именно вы хотите получить (хотя бы на примере вашего тестового XML).
Выражение вида
//street[@street="baker street"]/house[@house="221B"]/appartment
должно выбрать все квартиры указанного дома на указанного улице. Если нужны номера, то добавьте в конец /@appartment.

Apartment, кстати. И представляется излишним дублирование имен нод именами атрибутов.

Можно ли через x-path выбрать дом, где атрибут = чему-то, который находтся в теге улица, где атрибут = чему-то....
При помощи оси ancestor или, если родство непосредственное, parent.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽