首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xpath -在节点中查找文本-匹配整个单词。

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

Stack Overflow用户
提问于 2013-10-18 18:34:31
回答 1查看 970关注 0票数 1

下面是XML文件输出的一个示例--明显缩小了规模,并且一些信息发生了变化:

代码语言:javascript
复制
<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>节点中的所有子节点-所以,从<id><categories>的所有内容

实际上,我让所有的东西都正常工作,除了多个类别共享一个特定的单词。所以,我现在举的例子是“零售”--有一个“零售”和“零售时尚”的分类--我使用xpath的方式--它把所有的业务从这两个类别中拉进来,因为它没有寻找整个单词,或者做任何regex搜索。我有一种感觉,我需要使用matches,但还没有成功地正确实现它。我完全是xpath noob --我相信这是一个简单的答案,但我找不到一个很好的例子来说明我在任何地方都要做什么--或者至少找一个对我有用的例子。

下面是我为xpath所做的工作:

代码语言:javascript
复制
$results = $xml->xpath("//company[contains(categories/*,'Retail')]");

就像我说的,它返回它应该返回的一切,除了它包括“零售”和“零售时尚”两个类别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 18:47:43

就像我已经在注释中解释过的那样,您可以构造一个谓词,而不是用contains() (因为它将在整个节点值中搜索),还可以使用字符串与具体节点值的比较。

示例(演示):

代码语言:javascript
复制
$xml = simplexml_load_string($buffer);

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

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

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

这确实与具体的子节点相比:

代码语言:javascript
复制
//company[categories//*[. = 'Retail']]
                    ^^

因为您最可能寻找的<name>元素值是<category><category_sub>的子元素(这在XML中实际上是错误的,您有一棵树,很明显它是子元素,您不需要根据元素名不同--但这只是空白处的一个注释)。

请注意,如果您正在使用输入数据作为搜索术语,请阅读我的博客:

  • 减少PHP中的XPath注入攻击

它还指出了与该主题相关的堆叠式问答材料。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19456744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档