1

这是 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>节点 - 所以,从<id><categories>

实际上,我的一切工作正常,除非有多个类别共享一个特定的词。因此,我现在拥有的当前示例是“零售”——“零售”和“零售时尚”有一个类别——我做 xpath 的方式是从这两个类别中吸引所有业务,因为它不是在寻找整个单词,或进行任何正则表达式搜索。我有一种感觉,我需要使用matches它,但还没有成功地正确实施它。我是一个完全的 xpath 菜鸟——我相信这是一个简单的答案,但我找不到一个很好的例子来说明我在任何地方都想做的事情——或者至少一个对我有用的例子。

这是我为 xpath 做的事情:

$results = $xml->xpath("//company[contains(categories/*,'Retail')]");

就像我说的,这将返回所有内容,除了它同时包含“零售”和“零售时尚”类别。

4

1 回答 1

1

就像我已经尝试在评论中解释的那样,您可以制定一个谓词,而不是contains()(因为它将在整个节点值内搜索),而只是与一个具体节点值的字符串比较。

示例(演示):

$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>or的子元素<category_sub>(这在 XML 中实际上是错误的,您有一个树,很明显它是子元素,您不需要通过元素名称来区分 - 但那是只是页边空白处的注释)。

请注意,如果您将输入数据用作搜索词并阅读我的这篇博文:

它还指向有关该主题的相关 Stackoverflow 问答材料。

于 2013-10-18T18:47:43.910 回答