<?xml version="1.0" encoding="ISO-8859-1" ?>
- <OrderFeed>
- <Order id="1">
- <BillingInformation>
<Name>Bruce Ganek</Name>
<Address>99 Main Street</Address>
<City>Cranston</City>
<State>RI</State>
<ZipCode>02910</ZipCode>
</BillingInformation>
- <ShippingInformation>
<Name>Governor Chafee</Name>
<Address>82 Smith St # 115</Address>
<City>Providence</City>
<State>RI</State>
<ZipCode>02903-1121</ZipCode>
</ShippingInformation>
- <Items>
- <Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>10.50</UnitPrice>
<Quantity>2</Quantity>
<TotalCost>21.00</TotalCost>
- <CustomerOptions>
<Size>M</Size>
<Color>Green</Color>
</CustomerOptions>
</Item>
- <Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>7.50</UnitPrice>
<Quantity>3</Quantity>
<TotalCost>22.50</TotalCost>
- <CustomerOptions>
<Size>S</Size>
<Color>White</Color>
</CustomerOptions>
</Item>
- <Item>
<PartNo>JETSFLASHLIGHT</PartNo>
<Description>N.Y. Jets Flashlight</Description>
<UnitPrice>5.00</UnitPrice>
<Quantity>1</Quantity>
<TotalCost>5.00</TotalCost>
<CustomerOptions />
</Item>
</Items>
</Order>
- <Order id="2">
- <BillingInformation>
<Name>Walt Disney</Name>
<Address>DisneyWorld Hotel</Address>
<City>Orlando</City>
<State>FL</State>
<ZipCode>32801</ZipCode>
</BillingInformation>
- <ShippingInformation>
<Name>Walt Disney</Name>
<Address>DisneyWorld Hotel</Address>
<City>Orlando</City>
<State>FL</State>
<ZipCode>32801</ZipCode>
</ShippingInformation>
- <Items>
- <Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>10.50</UnitPrice>
<Quantity>2</Quantity>
<TotalCost>21.00</TotalCost>
- <CustomerOptions>
<Size>M</Size>
<Color>Green</Color>
</CustomerOptions>
</Item>
- <Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>7.50</UnitPrice>
<Quantity>3</Quantity>
<TotalCost>22.50</TotalCost>
- <CustomerOptions>
<Size>S</Size>
<Color>White</Color>
</CustomerOptions>
</Item>
- <Item>
<PartNo>JETSFLAG</PartNo>
<Description>N.Y. Jets Flag for display</Description>
<UnitPrice>5.00</UnitPrice>
<Quantity>1</Quantity>
<TotalCost>5.00</TotalCost>
<CustomerOptions />
</Item>
</Items>
</Order>
- <Order id="3">
- <BillingInformation>
<Name>Tom Brady</Name>
<Address>One Patriot Place</Address>
<City>Foxboro</City>
<State>MA</State>
<ZipCode>02035</ZipCode>
</BillingInformation>
- <ShippingInformation>
<Name>Tom Brady</Name>
<Address>2121 George Halas Drive</Address>
<City>Canton</City>
<State>OH</State>
<ZipCode>44708</ZipCode>
</ShippingInformation>
- <Items>
- <Item>
<PartNo>JETPANTS</PartNo>
<Description>N.Y. Jets Sweatpants</Description>
<UnitPrice>10.50</UnitPrice>
<Quantity>3</Quantity>
<TotalCost>31.50</TotalCost>
- <CustomerOptions>
<Size>M</Size>
<Color>Green</Color>
</CustomerOptions>
</Item>
- <Item>
<PartNo>JETSWEATER</PartNo>
<Description>N.Y. Jets Sweatshirt</Description>
<UnitPrice>7.50</UnitPrice>
<Quantity>1</Quantity>
<TotalCost>7.50</TotalCost>
- <CustomerOptions>
<Size>S</Size>
<Color>White</Color>
</CustomerOptions>
</Item>
- <Item>
<PartNo>JETSFLAG</PartNo>
<Description>N.Y. Jets Flag for display</Description>
<UnitPrice>5.00</UnitPrice>
<Quantity>1</Quantity>
<TotalCost>5.00</TotalCost>
<CustomerOptions />
</Item>
</Items>
</Order>
</OrderFeed>
上面是我正在解析的xml文档。我的目标是使用键入PartNo,比如说"JETSFLAG"是他们传递给应用程序的字符串。我想在OrderFeed中找到所有订单,并计算购买PartNo的具体次数。我有一个XPath导航器工具,由于某种原因,当我编写应该能得到我想要的表达式时,它不会返回任何内容。
这就是当我计算表达式时得到的结果://OrderFeed/Order/Items//Item//PartNo
,它为我提供了我需要的数据,我所需要的只是用户输入的任何特定项的计数。。。
<xml>JETSWEATER JETSWEATER JETSFLASHLIGHT JETSWEATER JETSWEATER JETSFLAG JETPANTS JETSWEATER JETSFLAG</xml>
现在,我很确定写count(//OrderFeed/Order/Items//Item//PartNo[JETSFLAG])
应该会导致2个项目被计数。但这就是我得到的回报…
<xml>0</xml>
显示计数时,返回0。有人能帮忙吗?
尝试路径:
/OrderFeed/Order/Items/Item[PartNo=JETSFLAG]
(根据您的环境适当报价)
现在,我很确定写
count(//OrderFeed/Order/Items//Item//PartNo[JETSFLAG])
应该会导致2个项目被计数。但这就是我得到的回报…<xml>0</xml>
以上XPath表达式存在几个问题:
PartNo[JETSFLAG]
的意思是:"选择任何具有名为JETSFLAG
的子元素的PartNo
元素"。但这不是你想要的——你实际上想要:任何PartNo
元素,其字符串值是字符串"JETSFLAG"
——所以使用:PartNo[. = 'JETSFLAG']
- 不必要使用缩写
//
。这通常是昂贵的,在这种特殊情况下,您只需要在每个位置步骤中选择元素的子元素,因此只使用/
运算符 - 您可以省略文档元素的名称,因为根据定义,格式良好的XML文档只有一个文档元素。因此,不编写
/OrderFeed
,而只使用/*
结合以上所有修复,我们分别得出这两个XPath表达式:
/*/Order/Items/Item/PartNo[. = 'JETSFLAG']
和
count(/*/Order/Items/Item/PartNo[. = 'JETSFLAG'])
前者选择两个想要的CCD_ 14元素。
后者返回其编号:2
我尝试了这个xpath,它似乎起作用了。
count(//OrderFeed/Order/Items/Item[PartNo = 'JETSFLAG'])
有几个人向您展示了所需的XPath表达式。但是要小心注射攻击!您永远不应该在不知道注入风险的情况下,通过将骨架表达式与用户提供的输入连接来构造XPath表达式。理想情况下,如果XPath API允许,请使用带有变量的表达式:
count(//OrderFeed/Order/Items/Item[PartNo = $param])
然后通过API提供$param的值。