Не удалось получить доступ к указанному узлу с помощью каскадного запроса xpath - PullRequest
0 голосов
/ 11 июня 2019

У меня есть XML-структура, подобная следующей, как SimpleXMLElement:

<?xml version="1.0" encoding="UTF-8"?>
<phonebooks>
    <phonebook name="phonebook">
        ...
        <contact>
            <carddav_uid>70ad8a26-21ab-4b42-b641-44a7667e802a</carddav_uid>
            <telephony>
                <number id="0" type="work">05171290</number>
                <number id="1" type="work">05171291919</number>
                <number id="2" type="work">05171292000</number>
                <number id="3" type="work">05171292010</number>
                <number id="4" type="work">05171292245</number>
                <number id="5" type="work">05171292313</number>
                <number id="6" type="work">05171292383</number>
                <number id="7" type="work">05171292617</number>
                <number id="8" type="work">05171292761</number>
            </telephony>
            <person>
                <realName>ACME Company</realName>
            </person>
        </contact>
        ...
    </phonebook>
</phonebooks>

Цель состоит в том, что если carddav_uid в первую очередь и во-вторых соответствует номеру телефона, то к этому номеру телефона должны быть добавлены определенные атрибуты.Первым критерием является carddav_uid, так как номер телефона может встречаться в нескольких контактах (например, у разных членов семьи с одинаковым номером стационарного телефона)

Найти правильный контакт очень просто:

if ($contact = $xmlTargetPhoneBook->xpath(sprintf('//contact[carddav_uid = "%s"]', $uid))) {

IЯ подумал, что было бы проще найти правильный номер телефона в узле с xpath вместо того, чтобы перебирать структуру:

if ($contact = $xmlTargetPhoneBook->xpath(sprintf('//contact[carddav_uid = "%s"]', $uid))) {
    if ($phone = $contact[0]->xpath(sprintf('/telephony/number[text() = "%s"]', $number))) {
        // check for debugging 
        print_r($phone);
        /*
        $phone->addAttribute($attribute = $value);
        */
    }
}

Но я ничего не получаю:

Array
(
)

Думаю ли янеправильно?

1 Ответ

1 голос
/ 11 июня 2019

/telephony/number выбирает из корня документа.Чтобы выбрать из элемента контекста (элемент contact), используйте ./telephony/number или просто telephony/number

...