4

这是我目前正在使用的一些代码。我需要帮助的地方是$bn_name_search$bn_id_search

$xpath_base='/ItemSearchResponse/Items/Item[';
for ($i = 1; $i<=10; $i++)
  {
    $curr_item_base=$xpath_base.$i.']';
    $bn_name_search=$curr_item_base.'/BrowseNodes//BrowseNode/Name/text()';
    $bn_id_search=$curr_item_base.'/BrowseNodes//BrowseNode/BrowseNodeId/text()';
    $bn_names=$parsed->xpath($bn_name_search);
    $bn_ids=$parsed->xpath($bn_id_search);
  }

这给了我所有 browsnode 名称和所有 broswnode id。我现在想做的是只找到BrowseNode/Name/不是“所有产品”的浏览节点名称“”,并且只有浏览节点 ID“BrowseNode/BrowseNodeId/共享一个” BrowseNode/,名称不是“所有产品”我不必测试的存在BrowseNode/Name。如果有 ID,则不会为空。如果我能放两个否定的表达就更好了。我会省略那些名字是“所有产品”和名字是“部门”的人

编辑: 这是 XML 的一个块:在它说“ &lt;Name&gt;Departments&lt;/Name&gt;”的地方,我想排除那个名字和它的 ID。如果我有一个类似的人说“ &lt;Name&gt;All Products&lt;/Name&gt;”,我也想排除那个名字和它的 ID。(通过ID,我的意思是&lt;BrowseNodeId&gt;

<BrowseNodes>
  <BrowseNode>
    <BrowseNodeId>2346727011</BrowseNodeId>
    <Name>Casual</Name>
    <Ancestors>
      <BrowseNode>
        <BrowseNodeId>1045024</BrowseNodeId>
        <Name>Dresses</Name>
        <Ancestors>
          <BrowseNode>
            <BrowseNodeId>1040660</BrowseNodeId>
            <Name>Women</Name>
            <Ancestors>
              <BrowseNode>
                <BrowseNodeId>1036682</BrowseNodeId>
                <Name>Departments</Name>
                <IsCategoryRoot>1</IsCategoryRoot>
                <Ancestors>
                  <BrowseNode>
                    <BrowseNodeId>1036592</BrowseNodeId>
                    <Name>Clothing &amp; Accessories</Name>
                  </BrowseNode>
                </Ancestors>
              </BrowseNode>
            </Ancestors>
          </BrowseNode>
        </Ancestors>
      </BrowseNode>
    </Ancestors>
  </BrowseNode>
</BrowseNodes>
4

3 回答 3

2

在没有看到您的 xml 结构的情况下,我想出了 xpath 来实现我认为您正在尝试做的事情。我也不太确定BrowseNodeId“共享”浏览节点名称,我认为这意味着BrowseNodeId为所有BrowseNode名称设置为此的 s 提供 s。

我在 php 之外结合了您的 xpath 以更好地可视化它:

/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/Name/text()
/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/

组合解决方案:

/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/Name[text()!='All Products']/text()
/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode[Name/text()!='All Departments']/BrowseNodeId/text()

php解决方案:

$xpath_base='/ItemSearchResponse/Items/Item[';
for ($i = 1; $i<=10; $i++)
  {
    $curr_item_base=$xpath_base.$i.']';
    $bn_name_search=$curr_item_base.'/BrowseNodes//BrowseNode/Name[text()!='All Products']';
    $bn_id_search=$curr_item_base.'/BrowseNodes//BrowseNode[Name/text()!='All Departments']/BrowseNodeId/text()';
    $bn_names=$parsed->xpath($bn_name_search);
    $bn_ids=$parsed->xpath($bn_id_search);
  }

更新 要结合 xpath,您可以使用 concatenate |

/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode[Name/text()!=\'Departments\' and Name/text()!=\'All Products\']/BrowseNodeId/text() | 
/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/Name[text()!=\'All Products\' and text()!=\'Departments\']

php:( 更新)

$bn_combined_search=$curr_item_base.'/BrowseNodes//BrowseNode[Name/text()!=\'Departments\' and Name/text()!=\'All Products\']/BrowseNodeId/text() |'.$curr_item_base.'/BrowseNodes//BrowseNode/Name[text()!=\'All Products\' and text()!=\'Departments\']';

如果我做出了错误的假设,请发布您的一些 xml 并详细说明您正在寻找的解决方案。希望这可以帮助!

于 2012-04-20T18:35:28.447 回答
2

你去:

$nodes = $parsed->xpath("//BrowseNode[Name!='Departments' and Name!='All Products']");
foreach ($nodes as $node) {
    echo "Id: {$node->BrowseNodeId}, name: {$node->Name}\n";
}
于 2012-04-20T22:48:48.233 回答
2

使用

//BrowseNode
      [not(contains('|Departments|All Products|',
                    concat('|', Name, '|')
                    )
          )
      ]/Name

此表达式选择Name作为元素的子BrowseNode元素且其字符串值不是字符串之一的"Departments"任何元素"All Products"

使用

//BrowseNode
      [not(contains('|Departments|All Products|',
                    concat('|', Name, '|')
                    )
          )
      ]
       /BrowseNodeId

这将选择BrowseNodeId作为元素的子BrowseNode元素并且具有Name其字符串值不是字符串之一的兄弟元素的"Departments"任何元素"All Products"

基于 XSLT 的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "//BrowseNode
      [not(contains('|Departments|All Products|',
                    concat('|', Name, '|')
                    )
          )
      ]/Name
      "/>
=================

  <xsl:copy-of select=
   "//BrowseNode
      [not(contains('|Departments|All Products|',
                    concat('|', Name, '|')
                    )
          )
      ]
       /BrowseNodeId
      "/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<BrowseNodes>
    <BrowseNode>
        <BrowseNodeId>2346727011</BrowseNodeId>
        <Name>Casual</Name>
        <Ancestors>
            <BrowseNode>
                <BrowseNodeId>1045024</BrowseNodeId>
                <Name>Dresses</Name>
                <Ancestors>
                    <BrowseNode>
                        <BrowseNodeId>1040660</BrowseNodeId>
                        <Name>Women</Name>
                        <Ancestors>
                            <BrowseNode>
                                <BrowseNodeId>1036682</BrowseNodeId>
                                <Name>Departments</Name>
                                <IsCategoryRoot>1</IsCategoryRoot>
                                <Ancestors>
                                    <BrowseNode>
                                        <BrowseNodeId>1036592</BrowseNodeId>
                                        <Name>Clothing &amp; Accessories</Name>
                                    </BrowseNode>
                                </Ancestors>
                            </BrowseNode>
                        </Ancestors>
                    </BrowseNode>
                </Ancestors>
            </BrowseNode>
        </Ancestors>
    </BrowseNode>
</BrowseNodes>

计算两个 XPath 表达式,并将它们的结果(由"========"字符串分隔)复制到输出

因此,我们可以从转换结果中验证是否准确地选择了想要的元素NameBrowseNodeId元素:

<Name>Casual</Name>
<Name>Dresses</Name>
<Name>Women</Name>
<Name>Clothing &amp; Accessories</Name>
=================

<BrowseNodeId>2346727011</BrowseNodeId>
<BrowseNodeId>1045024</BrowseNodeId>
<BrowseNodeId>1040660</BrowseNodeId>
<BrowseNodeId>1036592</BrowseNodeId>
于 2012-04-21T04:03:36.280 回答