【问题标题】:Couldn´t access the designated node with cascaded xpath query无法使用级联 xpath 查询访问指定节点
【发布时间】:2019-10-25 21:00:12
【问题描述】:

我有一个类似于下面的 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))) {

我认为使用 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
(
)

我想错了吗?

【问题讨论】:

    标签: php xpath simplexml


    【解决方案1】:

    /telephony/number 从文档的根目录中选择。要从上下文项(contact 元素)中进行选择,请使用 ./telephony/number 或简单地使用 telephony/number

    【讨论】:

    • 谢谢 - 我自己也发现了这一点:
    • 如果答案是正确的,那么即使您已经解决了问题,其他读者也可以将其标记为已接受。
    • 你愿意帮我做相反的事情吗?我选择包含某些属性的所有节点 $numbers = $xmlPhonebook-&gt;xpath('//number[@attrib_1 or @attribute_2]'); 此外,我必须在每种情况下确定节点 carddav_uid 或其内容。但是$parentNode = $numbers[0]-&gt;xpath("ancestor::*[contact]/*"); 向我提供了所有联系人,但没有提供特定的祖先。
    • 如果您有新问题,最好将其作为新问题提出,而不是作为对先前问题答案的评论,
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 2015-01-06
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多