2013-07-31 29 views
2

我是XPath和xml解析的新手。我閱讀了一些文檔,但找不到解決我的問題的方法。我的.xml看起來像這樣(FYI:它的「iTunes音樂Library.xml」的播放列表部分):Tricky xpath查詢

<dict> 
     <array> 
     <dict> 
      <key>Name</key><string>Playlist 1</string> 
      <key>Playlist ID</key><integer>187826</integer> 
      <key>Playlist Persistent ID</key><string>04250E0617138909</string> 
      <key>All Items</key><true/> 
      <key>Playlist Items</key> 
      <array> 
      <dict> 
       <key>Track ID</key><integer>11111</integer> 
      </dict> 
      <dict> 
       <key>Track ID</key><integer>22222</integer> 
      </dict> 
      </array 
     </dict> 
     <dict> 
      <key>Name</key><string>Playlist 2</string> 
      <key>Playlist ID</key><integer>187826</integer> 
      <key>Playlist Persistent ID</key><string>04250E0617138909</string> 
      <key>All Items</key><true/> 
      <key>Playlist Items</key> 
      <array> 
      <dict> 
       <key>Track ID</key><integer>23456</integer> 
      </dict> 
      <dict> 
       <key>Track ID</key><integer>34567</integer> 
      </dict> 
      </array 
     </dict> 
     </dict> 

我的輸入是包含播放列表的名稱的字符串。現在,這是我想要的輸出內容:與特定播放列表相關的所有歌曲ID。不幸的是,該名稱不是例如數組或第一個字典的屬性。這是我得到的(java代碼):

ap.selectXPath("//dict/array/dict/string[1][text()=\"" + playlistName + "\"]"); 

這只是給我我的playlistName當然。那麼如何從現在開始呢?這次來到我的腦海裏:解析這樣的文件,直到解析器到達期望的名稱:以「詮釋計數」

ap.selectXPath("//dict/array/dict[" + count++ +"]/string[1]"); 

。然後從適當的查詢中再次從該位置開始。然而,這似乎並不優雅或高效。

長話短說:是否有XPath查詢來滿足我的要求?

回答

1

元素以plist格式工作的方式是交替配對元素,每個值都是其key的第一個後續兄弟元素。因此,對於給定的鍵,你可以爲

key[. = 'Entry name']/following-sibling::*[1] 

訪問值,以便對你感興趣的具體實例中,對於「播放列表1」的dict元素

/dict/array/dict[key[. = 'Name']/following-sibling::*[1] = 'Playlist 1'] 

其軌道目錄array

/dict/array/dict[key[. = 'Name']/following-sibling::*[1] = 'Playlist 1'] 
    /key[. = 'Playlist Items']/following-sibling::*[1] 

,然後該組integer元件賦予軌道ID將是

/dict/array/dict[key[. = 'Name']/following-sibling::*[1] = 'Playlist 1'] 
    /key[. = 'Playlist Items']/following-sibling::*[1] 
    /dict/key[. = 'Track ID']/following-sibling::*[1] 

如果您從用戶輸入中獲取播放列表名稱並且它們可能包含單引號或雙引號字符,請小心。你不會說你正在使用的庫,但是如果它支持定義變量,那麼你應該使用該機制來注入你的值,而不是依靠字符串連接來建立你的表達式。

+0

感謝您的快速響應。這沒有竅門:) – hollandThomas