2012-06-15 6 views
1

저는 열에 Apple plists를 저장하는 SQL Server 2008 데이터베이스를 사용하고 있습니다. 나는 그 정보의 일부를 추출하는 빠르고 더러운 방법을 찾고있다.TSQL을 사용하여 Apple plist를 파싱하십시오.

나는 SQL Server can do XML parsing을 알고 있습니다. plist가 true XML이 아니기 때문에 데이터를 쿼리/조작하는 데 도움이되는 내용이 있습니까?

다른 방법으로는 plists를 구문 분석하기 위해 경량 Java 라이브러리에 대한 권장 사항이있는 경우 해당 경로를 사용할 수도 있습니다.

<dict> 
    <key>BundleSize</key> 
    <integer>16138240</integer> 
    <key>DynamicSize</key> 
    <integer>7569408</integer> 
    <key>Identifier</key> 
    <string>com.ea.scrabble.ipad.inc2</string> 
    <key>Name</key> 
    <string>Scrabble</string> 
    <key>Version</key> 
    <string>1.15.73</string> 
</dict> 
+0

DMBS는 무엇을 사용하고 있습니까? Oracle과 SQL Server에는 독점적 인 XML 구문 분석 도구가 있습니다. –

+0

MS SQL Server 2008 – tbone14

+1

약간의 통찰력을 줄 수 있습니다. - http://stackoverflow.com/a/9207497/763026 –

답변

1

키/값 쌍을 가져와야하는 경우 몇 가지 기본 TSQL 문자열 구문 분석을 사용할 수 있습니다. 아래 코드를 키/값/유형 테이블을 반환하는 함수로 바꿀 수 있어야합니다. 이 코드를 붙여넣고 실행하면 무슨 뜻인지 알 수 있습니다. [ID], [Key], [Value] 및 [ValueType] 열이있는 테이블을 반환합니다. 단일 plist를 전달하면 빠릅니다.

DECLARE @pList VARCHAR(255) 
SET @pList = 
'<dict> 

<key>BundleSize</key> 
<integer>16138240</integer> 

<key>DynamicSize</key> 
<integer>7569408</integer> 

<key>Identifier</key> 
<string>com.ea.scrabble.ipad.inc2</string> 

<key>Name</key> 
<string>Scrabble</string> 

<key>Version</key> 
<string>1.15.73</string> 

</dict> 
' 

DECLARE @IsKey BIT 
DECLARE @ID INT 
DECLARE @KeyValue TABLE (
    ID INT PRIMARY KEY IDENTITY(1,1) NOT NULL, 
    [Key] VARCHAR(255) NOT NULL, 
    [Value] VARCHAR(255) NULL, 
    [ValueType] VARCHAR(255) NULL 
    ) 

SET @IsKey = 1 

WHILE LEN(@pList) > 10 
BEGIN 


    IF @IsKey = 1 
    BEGIN 

     -- Remove junk at the beginning of the string: 
     SELECT @pList = SUBSTRING(@pList, CHARINDEX('<key>', @pList) + 5, LEN(@pList)) 

     -- Parse out the first value between the <key></key> tags: 
     INSERT INTO @KeyValue ([Key]) 
      SELECT LEFT(@pList, CHARINDEX('</', @pList)-1) 
     SELECT @ID = SCOPE_IDENTITY() 

     -- Remove new junk at the beginning of the string: 
     SELECT @pList = LTRIM(SUBSTRING(@pList, CHARINDEX(CHAR(13), @pList)+2, LEN(@pList))) 

     SET @IsKey = 0 

    END 
    ELSE -- Is a value 
    BEGIN 

     -- Parse out the ValueType and Value: 
     UPDATE @KeyValue 
      SET ValueType = (SELECT SUBSTRING(@pList, 2, CHARINDEX('>', @pList)-2)), 
      Value = (SELECT SUBSTRING(@pList, CHARINDEX('>', @pList)+1, CHARINDEX('</', @pList) - CHARINDEX('>', @pList)-1)) 
     WHERE ID = @ID 

     -- Remove new junk at the beginning of the string: 
     SELECT @pList = LTRIM(SUBSTRING(@pList, CHARINDEX(CHAR(13), @pList)+2, LEN(@pList))) 

     SET @IsKey = 1 

    END 

END 

SELECT * 
FROM @KeyValue 
관련 문제