@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
@throughtheether
human after all
Не вполне ясно, что именно вы хотите получить (хотя бы на примере вашего тестового XML).
Выражение вида
//street[@street="baker street"]/house[@house="221B"]/appartment
должно выбрать все квартиры указанного дома на указанного улице. Если нужны номера, то добавьте в конец /@appartment.

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

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

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

Похожие вопросы