קריאת קבצי XML בעזרת Python

15/08/2017

תגיות: , , , ,
אין תגובות

קריאת קבצי XML זה נושא כאוב ב-SQL Server, אם תשים תחבושת לא יעזור לך שנתיים: הפקודה אינה נוחה, לא משנה כמה פעמים השתמשתי בה בעבר – בכל פעם מחדש אני יוצא מדעתי והדברים ארוכים. בנוסף לכך – יש להכיר את הסכימה של ה-XML כדי “לפרסר” אותו בעזרת TSQL.
יתכן שבמקרים מסויימים נצליח להיעזר בפתרון שלהלן, בכפוף לכך שהגרסה שלנו תומכת בפייתון (2017 וצפונה), ושה-XML כתוב כך שהפייתון יכול לו: הוא אינו אוהב שבכותרת הקובץ יש שורת פרטים בסגנון של

<?xml version="1.0" encoding="UTF-8"?>

תווים מסויימים מוציאים אותו מדעתו, בעיקר ‘גרשיים’ בודדים אם הופכים את המידע ל-JSON, סגירת תגיות לא מפורשת-

<foo>bla..bla..bla</>

אינה נאה בעיניו והוא ידרוש סגירה מפורשת-

<foo>bla..bla..bla</foo>

ועוד כל מיני דרישות קואליציוניות שבלעדיהן הכל יפול.

לנוחיות ציבור המאזינים יש קובץ זמין להורדה שהוא מצליח לקרוא (למעשה זו אותה טבלה ששלחנו באימייל בפוסט הקודם).

להלן הקוד:

Declare    @Result Varchar(Max);

Exec    sp_execute_external_script

        @language=N'Python',

        @script =N'

import xml.etree.ElementTree as ET

import pandas as pd

xml_data=open("c:/Tmp/xml/MyXML.xml").read()

root=ET.XML(xml_data)

all_records=[]

for i, child in enumerate(root):

    record={}

    for subchild in child:

        record[subchild.tag]=subchild.text

        all_records.append(record)

XML=pd.DataFrame(all_records)

Result=str(all_records)

OutputDataSet=XML',

        @params=N'@Result Varchar(Max) Output',

        @Result=@Result Output

--Print    @Result;

 

Select  *

From OpenJSON(Replace(@Result,'''','"')) J1

Outer Apply    (Select  *

            From    OpenJSON(J1.value) J2) J2;

בשורה 7 יש לציין את המיקום בשרת (לא בדיסק המקומי שלכם אם ההתקנה בשרת נפרד), ויש להפוך את כיוון הלוכסנים מ-\ ל-/.
כל השאר ללא שינוי, אם כי יתכן שנגלה שהספריות המצויינות בשורות 5-6 בפקודות ה-import חסרות ואז יש להתקינן כמתואר בפוסט הקודם.
אם שפר עלינו מזלנו נקבל פלט כדלקמן:

image

עשיתי כאן עבודה כפולה – גם פלט טבלאי שניתן לעצב בעזרת With Results Set (פרטים בפוסט הקודם),
וגם פלט JSON-י שניתן “לפרסר” בעזרת OpenJSON (אם כי מתבצע UnPivot וכל שורה בת 9 עמודות הופכת ל-9 שורות.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *