下面是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的方式--它把所有的业务从这两个类别中拉进来,因为它没有寻找整个单词,或者做任何regex搜索。我有一种感觉,我需要使用matches,但还没有成功地正确实现它。我完全是xpath noob --我相信这是一个简单的答案,但我找不到一个很好的例子来说明我在任何地方都要做什么--或者至少找一个对我有用的例子。
下面是我为xpath所做的工作:
$results = $xml->xpath("//company[contains(categories/*,'Retail')]");就像我说的,它返回它应该返回的一切,除了它包括“零售”和“零售时尚”两个类别。
发布于 2013-10-18 18:47:43
就像我已经在注释中解释过的那样,您可以构造一个谓词,而不是用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>或<category_sub>的子元素(这在XML中实际上是错误的,您有一棵树,很明显它是子元素,您不需要根据元素名不同--但这只是空白处的一个注释)。
请注意,如果您正在使用输入数据作为搜索术语,请阅读我的博客:
它还指出了与该主题相关的堆叠式问答材料。
https://stackoverflow.com/questions/19456744
复制相似问题