2015-01-08 29 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應該有足夠能力來解決這個問題,但我想這是不。