2014-10-20 210 views
1

我想使用Microsoft Excel的FILTERXML函数从XML表单中获取数据。XPath“节点中有多少个元素?”与Microsoft EXCEL

我不太清楚为什么我使用某些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的参数计算有多少玩家在每一个刷新的XML表单,以便ofter动态API弹出。玩家数从0-10变化。

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

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

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

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

+0

你想要做的正确的XPath是'count(/ result/matches/match/players/player)',但看起来像FILTERXML可能只允许XPath计算节点集(和' count()'求值到一个数字 – JLRishe 2014-10-20 05:44:07

回答

0

为什么不使用正则表达式呢?

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

会得到你所有的玩家标签,并且不会与XPath摔跤。 在此标签内,您可以获得其余的

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

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

或者我还创建了一个带有内嵌的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>") 

eg获取第一个account_id。

+0

感谢您的回复我不知道VBA,所以我不知道如何做任何正则表达式,我试图在Excel中完成所有内部工作,但它看起来像这是不可能的,因为它不符合我的口味 我试着下载你的Excel插件,但它给了我一个错误在您的网站上,“/ share/MD0_DATA/Web/wordpress/wp-content/plugins/download- manager/cache/must must be writable!“ – 2014-10-21 05:45:37

+0

好的,实际上正则表达式不仅仅是VBA,它们被用在所有的编程语言中,甚至在excel中使用ctrl + f对话框。水库只知道正则表达式而不是vba。 Thx的抬头,但我会在一个小时左右解决下载问题。 – 2014-10-21 05:54:25

+0

好了解决了这个问题。再次感谢! – 2014-10-21 06:55:36