2015-01-08 28 views
1

我正在使用XOM解析xml文件,但遇到按字符串名称获取Element的问题。我可以通过遍历getChild(x)(其中x=0:ChildCount)来访问每个元素,但是我必须绕过有内置函数来完成此任务的软件,这似乎很愚蠢。为什么我要获得NPE?看到下面的例子...我100%确定父母包含一个孩子与我正在寻找的确切名称。我能做些什么来解决这个问题?使用XOM解析XML时为空子元素

FileInputStream xmlFile = new FileInputStream("temp.xml"); 
Builder builder = new Builder(); 
Document doc = builder.build(xmlFile); 
Element root = doc.getRootElement(); 

System.out.println(((Element)root.getChild(1)).getLocalName()); //--> prints "player" 
Element player = root.getFirstChildElement(((Element)root.getChild(1)).getLocalName()); //--> null 
System.out.println(player); //--> prints "null" 
Element player_stats = player.getFirstChildElement("player_stats"); //--> NPE 

temp.xml

<?xml version="1.0" encoding="UTF-8"?> 
<fantasy_content xml:lang="en-US" 
yahoo:uri="http://fantasysports.yahooapis.com/fantasy/v2/player/nfl.p.7206/stats;type=week;week=2" 
time="34.230947494507ms" copyright="Data provided by Yahoo! and STATS, LLC" 
refresh_rate="31" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" 
xmlns="http://fantasysports.yahooapis.com/fantasy/v2/base.rng"> 
<player> 
    <player_key>331.p.7206</player_key> 
    <player_id>7206</player_id> 
    <name> 
     <full>Heath Miller</full> 
     <first>Heath</first> 
     <last>Miller</last> 
     <ascii_first>Heath</ascii_first> 
     <ascii_last>Miller</ascii_last> 
    </name> 
    <injury_note>not injury related</injury_note> 
    <editorial_player_key>nfl.p.7206</editorial_player_key> 
    <editorial_team_key>nfl.t.23</editorial_team_key> 
    <editorial_team_full_name>Pittsburgh Steelers</editorial_team_full_name> 
    <editorial_team_abbr>Pit</editorial_team_abbr> 
    <bye_weeks> 
     <week>12</week> 
    </bye_weeks> 
    <uniform_number>83</uniform_number> 
    <display_position>TE</display_position> 
    <is_undroppable>0</is_undroppable> 
    <position_type>O</position_type> 
    <eligible_positions> 
     <position>TE</position> 
    </eligible_positions> 
    <has_player_notes>1</has_player_notes> 
    <player_stats> 
     <coverage_type>week</coverage_type> 
     <week>2</week> 
     <stats> 
      <stat> 
       <stat_id>0</stat_id> 
       <value>1</value> 
      </stat> 
      <stat> 
       <stat_id>1</stat_id> 
       <value>0</value> 
      </stat> 
      <stat> 
       <stat_id>2</stat_id> 
       <value>0</value> 
      </stat> 
      <stat> 
       <stat_id>3</stat_id> 
       <value>0</value> 
      </stat> 

      ... 

      <stat> 
       <stat_id>81</stat_id> 
       <value>0</value> 
      </stat> 
     </stats> 
    </player_stats> 
</player> 
</fantasy_content> 

谢谢!

回答

1

终于明白了,发布问题后的瞬间。为什么总是这样?

我需要的是NameSpace参数。相反,硬编码的,我检索的根节点的命名空间,并假定它的孩子的命名空间是相同的:

String nameSpace = root.getNamespaceURI(); 
// getChildElements 
Element player = root.getFirstChildElement("player",nameSpace); 
Element player_stats = player.getFirstChildElement("player_stats",nameSpace); 

好像XOM应该有足够能力来解决这个问题,但我想这是不。