Разобрать plist Apple с помощью TSQL

Я работаю с базой данных SQL Server 2008, в которой хранятся списки Apple в столбце. Я ищу быстрый и грязный способ извлечь часть этой информации.

Я знаю, что SQL Server может выполнять синтаксический анализ XML. Поскольку plist не является настоящим XML, есть ли что-нибудь, что может помочь мне запрашивать/манипулировать данными?

В качестве альтернативы, если у кого-то есть рекомендация по облегченной библиотеке 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>

person tbone14    schedule 15.06.2012    source источник
comment
Какую СУБД вы используете? В Oracle и SQL Server есть несколько проприетарных инструментов разбора XML.   -  person N West    schedule 15.06.2012
comment
Может дать вам некоторое представление - stackoverflow.com/a/9207497/763026   -  person Angshuman Agarwal    schedule 15.06.2012
comment
А как насчет plist, это не настоящий XML? Пока он правильно сформирован, вы можете вставить его в столбец XML, а затем использовать информацию, на которую вы уже ссылались в теле своего вопроса.   -  person bluevector    schedule 15.06.2012


Ответы (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
person Russell Fox    schedule 15.06.2012