无法计算出 XPath 计数表达式结果。C# xml Web Services


<?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表达式存在几个问题

  1. PartNo[JETSFLAG]的意思是:"选择任何具有名为JETSFLAG的子元素的PartNo元素"。但这不是你想要的——你实际上想要:任何PartNo元素,其字符串值是字符串"JETSFLAG"——所以使用:PartNo[. = 'JETSFLAG']
  2. 不必要使用缩写//。这通常是昂贵的,在这种特殊情况下,您只需要在每个位置步骤中选择元素的子元素,因此只使用/运算符
  3. 您可以省略文档元素的名称,因为根据定义,格式良好的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的值。