xpath - 在节点中查找文本 - 匹配整个单词

时间:2013-10-18 18:34:32

标签: php xml xpath

这是XML文件输出的一个示例 - 显然缩小了一些信息并改变了一些信息:

<directory>
    <company>
        <id>5002</id>
        <company_name>Clothing Store</company_name>
        <address>123 street</address>
        <latitude>51.123456</latitude>
        <longitude>-113.12345432</longitude>
        <phone>1234567890</phone>
        <fax/>
        <website/>
        <logo_url/>
        <categories>
            <category>
                <name>Retail Fashion</name>
                <sub_categories>
                    <category_sub>
                        <id>5056</id>
                        <name>Her Style / Ladies Wear</name>
                    </category_sub>
                </sub_categories>
            </category>
        </categories>
    </company>
    <company>
        <id>5003</id>
        <company_name>Hardware Store</company_name>
        <address>123 street</address>
        <latitude>51.123456</latitude>
        <longitude>-113.12345432</longitude>
        <phone>1234567890</phone>
        <fax/>
        <website/>
        <logo_url/>
        <categories>
            <category>
                <name>Retail</name>
                <sub_categories>
                    <category_sub>
                        <id>5001</id>
                        <name>Hardware</name>
                    </category_sub>
                </sub_categories>
            </category>
        </categories>
    </company>
    <company>...</company>
</directory>

所以,这就是问题所在。我有一个业务目录的xml文件。我需要根据类别对其进行文本搜索,并仅在其<company>节点中提取具有这些类别的业务。所以,假设我搜索“零售”,我需要任何将“零售”作为一个类别的业务,但我需要返回<company>节点内的所有子节点 - 所以,所有内容都来自{{1转到<id>

我实际上一切正常,除非多个类别共享一个特定的单词。因此,我现在拥有的当前示例是“零售” - 有一个“零售”和“零售时尚”的类别 - 我正在做我的xpath的方式,因为它不是在寻找这两个类别的所有业务整个单词,或进行任何正则表达式搜索。我觉得我需要使用<categories>,但还没有成功地正确实现它。我是一个完整的xpath noob - 我确信这是一个简单的答案,但我找不到一个很好的例子,我想在任何地方做什么 - 或者至少有一个对我有用。

这是我正在为xpath做的事情:

matches

就像我说的那样,除了它包括“零售”和“零售时尚”类别之外,它将返回所有内容。

1 个答案:

答案 0 :(得分:1)

就像我已经尝试在注释中解释一样,你可以用contains()来表示一个谓词(因为它将在一个整个节点值内搜索),但也只是用一个具体的节点值进行字符串比较。

示例(Demo):

$xml = simplexml_load_string($buffer);

$expression = "//company[categories//*[. = 'Retail']]";

$result = $xml->xpath($expression);

foreach ($result as $index => $element)
{
    echo '#', $index, ': ', $element->asXML(), "\n";
}

这与具体的子节点进行比较:

//company[categories//*[. = 'Retail']]
                    ^^

因为您最有可能找到的<name>元素值是<category><category_sub>的子级(实际上XML中存在错误,所以您有一棵树,很明显它是sub,你不需要以元素名称不同 - 但这只是边距中的一个注释。)

请注意,如果您使用输入数据作为搜索字词,请阅读我的博客文章:

它还指向有关该主题的相关Stackoverflow Q&amp; A材料。