2

私は一般的に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 クエリはありますか?

4

1 に答える 1

1

要素が plist 形式で機能する方法は、dict要素のペアを交互にすることです。各値は、その の最初に続く兄弟要素ですkey。したがって、特定のキーに対して、次のように値にアクセスできます

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

したがって、関心のある特定の例では、dict「プレイリスト 1」の要素は

/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]

ユーザー入力からプレイリスト名を取得する場合は、一重引用符または二重引用符が含まれている可能性があることに注意してください。使用しているライブラリはわかりませんが、変数の定義をサポートしている場合は、式を構築するために文字列連結に頼るのではなく、そのメカニズムを使用して値を挿入する必要があります。

于 2013-07-31T16:22:46.253 に答える