这是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
就像我说的那样,除了它包括“零售”和“零售时尚”类别之外,它将返回所有内容。
答案 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材料。