XPath“节点中有多less个元素?”与Microsoft EXCEL

我正在尝试使用Microsoft Excel的FILTERXML函数从XML表单中获取数据。

我不太清楚为什么我使用某些XPath参数时无法获得数字响应。

这是我的XML:

<result> <status>1</status> <num_results>1</num_results> <total_results>500</total_results> <results_remaining>499</results_remaining> <matches> <match> <radiant_team_id>0</radiant_team_id> <dire_team_id>0</dire_team_id> <players> <player> <account_id>141684701</account_id> <player_slot>0</player_slot> <hero_id>0</hero_id> </player> <player> <account_id>4294967295</account_id> <player_slot>1</player_slot> <hero_id>0</hero_id> </player> <player> <account_id>4294967295</account_id> <player_slot>2</player_slot> <hero_id>0</hero_id> </player> </players> </match> </matches> </result> 

我正在尝试使用这个XPath参数来计算在一个dynamicAPI中popup多less个播放器,每次都刷新一个XML表单。 玩家数从0-10变化。

 /result/matches/match/players[count(player)] 

我收到#!VALUE错误。 这里是我使用的MS Excel函数参数:

 =FILTERXML($A$2,"/result/matches/match/players/player[count(player)]") 

两个论点都失败了 有没有办法通过报告MS Excel中的另一个单元来报告XML表单中存在多less个播放器元素?

为什么不使用正则expression式呢?

 <player>((?:.|\n)*?)</player> 

将得到你所有的球员标签,并没有与XPath摔跤。 在这个标签里面,你可以得到其余的例如

 <account_id>((?:.|\n)*?)</account_id> 

您可以使用VBA CreateObject(“VBScript.RegExp”)对象: http : //msdn.microsoft.com/en-us/library/ms974570.aspx

或者,我还创build了一个embedded式Excel UDF函数的插件 – “GetRegex” (一个函数可以像Excel中的FilterXML一样使用)。 看到这里: http : //blog.tkacprow.pl/excel-tools/excel-scrape-html-add/

获取第一个玩家标签的例子:

 =GetRegex(A1;"<player>((?:.|\n)*?)</player>";0) 

获取第二个玩家标签的例子:

 =GetRegex(A1;"<player>((?:.|\n)*?)</player>";1) 

你也可以嵌套它们:

 =GetRegex(GetRegex(A1;"<player>((?:.|\n)*?)</player>");"<account_id>((?:.|\n)*?)</account_id>") 

例如获取第一个account_id。