2013-07-31 2 views
2

XPath 및 xml 구문 분석에 익숙하지 않습니다. 나는 몇 가지 문서를 읽었지만 내 문제에 대한 해결책을 찾지 못했습니다.까다로운 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> 

내 입력이 재생 목록의 이름이 포함 된 문자열입니다 (: 그것은 "아이튠즈 뮤직 Library.xml에"의 재생 목록의 일부입니다 참고)이 같은 내 .XML 보인다. 이제 내 출력을 위해 원하는 것은 다음과 같습니다. 특정 재생 목록과 관련된 모든 songID. 불행히도이 이름은 예를 들어 배열 또는 그 첫 번째 dict의 속성이 아닙니다. 여기에 내가 무엇을 가지고 (자바 코드) :

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

그냥 그게 내 playlistName 물론. 이제부터 어떻게해야할까요? 파서가 원하는 이름에 도달 할 때까지 이와 같은 파일을 구문 분석하십시오. "int count"가있는

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

그런 다음 적절한 위치에서 다시 시작하십시오. 다시 말하지만, 이것은 우아하고 효율적이지 않습니다.

짧은 이야기 : 내 요구 사항을 충족시키는 XPath 쿼리가 있습니까?

답변

1

요소가 key의 첫 번째 다음 형제 요소 인 각각의 값과 함께, 요소가 plist 형식으로 작동하는 방법은입니다. 당신은 그래서 당신이 관심있는 특정 예를 들어

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] 

다음 트랙 ID를 부여 integer 요소들의 세트는 것

/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