私は一般的にXPathとxmlの解析に不慣れです。いくつかのドキュメントを読みましたが、問題の解決策が見つかりませんでした。私の .xml は次のようになります (fyi: 「iTunes Music Library.xml」のプレイリスト部分です):
<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>
私の入力は、プレイリストの名前を含む文字列です。出力に必要なものは次のとおりです。その特定のプレイリストに関連するすべての songID。残念ながら、名前は、たとえばarrayやその最初のdictの属性ではありません。これが私が持っているものです(Javaコード):
ap.selectXPath("//dict/array/dict/string[1][text()=\"" + playlistName + "\"]");
もちろん、それは私のプレイリスト名を教えてくれます。では、これからどのように進めていくべきか。これが私の頭に浮かびました: パーサーが目的の名前に到達するまで、次のようにファイルを解析します。
ap.selectXPath("//dict/array/dict[" + count++ +"]/string[1]");
「intカウント」で。次に、適切なクエリを使用してその位置から再開します。繰り返しますが、これはエレガントでも効率的でもないようです。
簡単に言えば、要件を満たす XPath クエリはありますか?