אני בונה Toolz.dev, ועבודה חוזרת על פני עבודת וורדפרס ולארוול שאני עושה היא הזנת נתונים למערכות שתוכננו לפני עשור או שניים הרבה מהם עדיין מדברים XML ורק XML: הזנת מוצר לשוק, פורמט ייבוא לחבילת הנהלת חשבונות, נקודת קצה של SOAP שלא תסתכל על שום דבר אחר הנתונים כמעט תמיד מגיעים כיצוא CSV מגיליון אלקטרוני, אז המשימה היא להפוך שורות שטוחות מופרדות בפסיקים למסמך XML מובנה צפיתי שמשתבש בכל דרך אפשרית, משם לקוח המכיל פסיק שהתפצל לשתי עמודות, לאמפרסאנד בשם חברה שגרם לכל הקובץ להיכשל בניתוח ממיר CSV ל-XML קיים כדי לבצע את ההמרה הזו בצורה נכונה, בדפדפן, מבלי להדביק רשימת לקוחות בשרת אנונימי כלשהו. מדריך זה מכסה מה כוללת ההמרה, מדוע החלקים המסובכים מסובכים וכיצד לעצב את הפלט עבור כל מה שהולך לקרוא אותו.
TL;DR: ממיר CSV ל-XML קורא שורות מופרדות בפסיקים וכותב אותן כמסמך XML מעוצב היטב, כאשר כל שורה הופכת לאלמנט וכל תא הופך לאלמנט צאצא בעל שם או לתכונה. הוא מנתח CSV לכל RFC 4180, כך ששדות מצוטטים המכילים פסיקים, ציטוטים או מעברי שורות שורדים בשלמותם; הוא מזהה אוטומטית אם המפריד הוא פסיק, נקודה-פסיק, לשונית או צינור; הוא כופה שמות עמודות לתגי XML חוקיים; והוא בורח מהתווים המשמעותיים לסימון כך שהפלט תמיד מנתח. הוא פועל כולו בדפדפן שלך, כך שהנתונים ב-CSV שלך לעולם לא יועלו.
מה ההבדל בין CSV ל-XML?
CSV, ערכים מופרדים בפסיקים, הוא פורמט טקסט שטוח כל שורה היא רשומה, ובתוך שורה כל שדה מופרד על ידי מפריד, בדרך כלל פסיק הוא קומפקטי, כל גיליון אלקטרוני יכול לייצא אותו, וזה טריוויאלי עבור אדם לקרוא מה שהוא לא יכול לעשות זה לבטא מבנה או משמעות אין שום דבר ב-CSV שאומר מה המשמעות של עמודה, אין קינון, אין סוגים; תא מחזיק true ותא המחזיק את המילה true אינם ניתנים להבחנה, וערך שבעצמו מכיל פסיק זקוק לציטוט מיוחד כדי להימנע מקריאה כשני שדות.
XML, שפת הסימון הרחבה, היא המסחר ההפוך כל ערך עטוף בתג בשם, אז <name>Ada Lovelace</name> נושא גם את הערך וגם את התווית עבורו. המילוליות הזו קונה מבנה: אלמנטים מקננים, ניתן לאמת מסמכים מול סכימה, וגיליון סגנונות יכול לשנות את כל העניין. הכללים למה שקובע כ-XML מעוצב היטב מפורטים ב- מפרט W3C XML 1.0, והם קפדניים בדרכים CSV אף פעם לא, וזו בדיוק הסיבה שהמרה מכנית צריכה להיות זהירה. המרת CSV ל-XML עוסקת ביסודה בהוספת המבנה והבריחה ש-CSV משאיר מרומזת.
איך שורה הופכת לאלמנט?
המיפוי הטבעי מתייחס לשורת ה-CSV הראשונה כאל הכותרת, המחזיקה בשמות העמודות, ולכל שורה הבאה כאל רשומה אחת כל רשומה הופכת לאלמנט שורה, ובתוכה כל תא הופך לאלמנט צאצא הקרוי על שם העמודה שלו אז CSV של id,name,role עם שורת נתונים 1,Ada Lovelace,Engineer הופך ל:
<rows>
<row>
<id>1</id>
<name>Ada Lovelace</name>
<role>Engineer</role>
</row>
</rows>
החיצוני rows אלמנט הוא שורש המסמך, מכיוון שלמסמך XML מעוצב היטב חייב להיות בדיוק אלמנט אחד ברמה העליונה שעוטף את כל השאר. הממיר מאפשר לך לשנות את שם השורש והאלמנט לכל שורה, כדי שתוכל לייצר <catalog><product>...</product></catalog> במקום זאת כאשר זה מה היעד שלך מצפה שמות העמודות הופכים לשמות התג, וזה המקום שבו האילוץ האמיתי הראשון נושך, כי לא כל כותרת עמודה היא תג XML חוקי.
מדוע חלק משמות העמודות משתנים?
שמות רכיבי XML אינם בצורה חופשית. המפרט אומר ששם חייב להתחיל באות או בקו תחתון ולאחר מכן עשוי להכיל אותיות, ספרות, מקפים, נקודות וקו תחתון, אך לא רווחים ולא רוב סימני הפיסוק, וייתכן שהוא לא יתחיל בספרה. עמודת גיליון אלקטרוני בשם First Name או Unit Price ($) או 2024 Total הוא כותרת טובה לחלוטין ותג XML לא חוקי. אם ממיר פלט <First Name> המסמך לא היה מנתח כלל.
אז הכלי מחטא כל שם עמודה לתג חוקי רווחים ותווים לא חוקיים הופכים לקו תחתון, אז First Name הופך First_Name, ושם שמתחיל בספרה מקבל קידומת קו תחתון כך 2024 Total הופך _2024_Total. אם שתי עמודות מחטאות לאותו תג, או שהכותרת חוזרת באמת על שם, הכפילויות מקבלים סיומת מספרית כך שאף עמודה לא מחליפה בשקט אחר, והכלי מזהיר אותך מתי הוא עשה זאת. הערובה החשובה היא שרק שמות התגים מותאמים; הנתונים בתוך כל תא מועברים ללא נגיעה. אם אתה צריך לשמור את התוויות המקוריות בדיוק, מצב התכונה, המכוסה להלן, לרוב מתאים יותר מכיוון ששמות התכונות פונים לאותם כללים, אך אתה יכול גם לבחור לשאת את הכותרת כערך במקום אחר.
מה לגבי פסיקים וציטוטים בתוך ערך?
זה החלק ששובר ממירים נאיביים, וכדאי להבין. CSV יש מוסכמה ציטוט, פורמאלית ב RFC 4180, עבור ערכים המכילים את המפריד או הפסקת קו ערך כזה עטוף במרכאות כפולות, וכל ציטוט כפול מילולי בתוכו כתוב כשתי מרכאות כפולות אז אחזקת שדה חברה Hopper, Grace מאוחסן ב-CSV as "Hopper, Grace", וקריאת פתק she said "hi" מאוחסן כ "she said ""hi""".
ממיר שמפצל כל שורה בפסיקים יבלבל את שניהם, יהפוך שדה אחד לשניים וישאיר ציטוטים תועים בכל מקום כלי זה משתמש במנתח מצב-מכונה תקין שעוקב אחר האם הוא נמצא בתוך שדה מצוטט, כך שפסיק מוטבע, ציטוט מוטבע, ואפילו שורה חדשה בתוך ערך מצוטט נקראים כולם כחלק מהשדה היחיד שאליו הם שייכים. זה ההבדל בין לקוח בשם Smith, John מגיע כאחד <name> אלמנט והגעה כרשומה שבורה עם עמודה נוספת. אם הייצוא שלך יצא מ-Excel, Google Sheets או dump של מסד נתונים, הוא כמעט בוודאות משתמש בציטוט הזה, וניתוח נכון אינו אופציונלי.
ברגע שהערך מנותח בבטחה, עדיין יש להפוך אותו לבטוח עבור XML, שהיא בעיית בריחה נפרדת. חמישה תווים מיוחדים ב-XML, והשלושה החשובים בטקסט האלמנט הם האמפרסנד, הסימן הקטן והגדול מהסימן. תא המכיל Ben & Jerry's או x < y ייצור XML לא חוקי אם נכתב מילולית, כך שהממיר מחליף אותם בישויות המוגדרות מראש &, <, ו >. בערכי תכונות נמלט גם הציטוט הכפול. בריחה זו היא מה שמבטיח שהפלט מנתח לא משנה מה הנתונים מכילים.
האם כל תא צריך להיות אלמנט או תכונה?
XML נותן לך שני מקומות לשים ערך: כטקסט של רכיב צאצא, או כתכונה על רכיב השורה הממיר תומך בשניהם, ואיזה מהם צודק תלוי לחלוטין במערכת שתקרא את הקובץ מצב אלמנט מייצר את הצורה הניתנת לקריאה, הניתנת לקינון:
<row>
<name>Ada</name>
</row>
מצב תכונה ממוטט את כל השורה לאלמנט סגירה עצמית אחד:
<row name="Ada" role="Engineer"/>
הנה איך השניים משווים על הממדים שבדרך כלל מחליטים על זה:
| התחשבות | אלמנטים ילד | תכונות |
|---|---|---|
| קריאות | גבוה יותר, ערך אחד לכל שורה | צפוף יותר, שורה אחת בכל שורה |
| גודל הקובץ | גדול יותר, תגיות חוזרות | קטן יותר |
| יכול לקנן בהמשך | כן | לא |
| ערכים חוזרים בכל עמודה | מותר | ערך אחד לכל שם תכונה |
| התאמה אופיינית | נתונים בסגנון מסמך, עדכונים | רשומות קומפקטיות, config |
ככלל אצבע, אם הנתונים דמויי רשומה ושטוחים והקורא רוצה אותם קטנים, התכונות בסדר; אם הנתונים עשויים לגדול מבנה מאוחר יותר, או שאדם יקרא אותם, אלמנטים הם ברירת המחדל הבטוחה יותר. כאשר אינך בטוח מה המערכת הצורכת רוצה, אלמנטים הם הבחירה השמרנית יותר מכיוון שכל דבר שמקבל תכונות יכול להיות מותאם גם לאלמנטים, אבל ההיפך לא תמיד נכון.
כיצד להשתמש בממיר CSV ל-XML
שלב 1: הדבק את ה-CSV שלך
הדבק או הקלד את ה-CSV שלך בתיבת הקלט. בלוק שהועתק ישירות מ-Excel או מ-Google Sheets עובד, וכך גם התוכן של א .csv קובץ, כולל שדות מצוטטים המכילים פסיקים או מעברי שורות.
שלב 2: הגדר את האפשרויות
השאר את המפריד בזיהוי אוטומטי או בחר אחד במפורש, אשר אם השורה הראשונה היא כותרת, הגדר את שמות רכיבי השורש והשורה, ובחר אם כל תא הופך לרכיב צאצא או לתכונה. אתה יכול גם להחליף את הצהרת ה-XML ולעבור בין פלט מחורץ למוקצץ.
שלב 3: המר
לחץ על המר ל-XML. הכלי מנתח כל שורה, מחטא את שמות העמודות לתגים חוקיים, בורח מתווי הסימון ומרכיב מסמך מעוצב היטב, ומזהיר אותך לגבי כל עמודות ששמם שונה או שורות מרופטות.
שלב 4: העתק או הורד
העתק את ה-XML ללוח שלך או הורד אותו בתור א .xml קובץ. אם הצורה לא ממש מתאימה למערכת היעד, כוונן את שמות האלמנטים או עבור בין מצב אלמנט ותכונה והמר שוב.
מדוע לזהות אוטומטית את המפריד?
לא כל "CSV" מופרד בפסיקים. יצוא ממקומות אירופיים משתמש לעתים קרובות בנקודה-פסיק, מכיוון שהפסיק הוא המפריד העשרוני באותם אזורים, ונתונים שנשלפו ממסד נתונים או יומן מופרדים לעתים קרובות בטאבים. ממיר נעול לפסיקים יקרא קובץ נקודה-פסיק כעמודה רחבה אחת וייצור שטויות. כלי זה מזהה את המפריד על ידי ניסיון פסיק, נקודה-פסיק, לשונית וצינור ובחירה של מה שמייצר ספירת עמודות עקבית על פני מספר השורות הראשונות, שהוא אות אמין הרבה יותר מתדר גולמי מכיוון שפסיק בתוך פרוזה מופיע לעתים קרובות אך באופן לא סדיר. אתה תמיד יכול לעקוף את הניחוש כאשר קובץ יוצא דופן, אבל במקרים הנפוצים הזיהוי אומר שאתה מדביק והולך.
שורות מרופטות, שבהן לשורה יש יותר או פחות שדות מהכותרת, הן הבלגן האחר בעולם האמיתי הממיר רפידות שורות קצרות עם אלמנטים ריקים ומזהיר אותך במקום להפיל נתונים בשקט, כך שתוכל לראות שבשורה 47 היו חסרים שני השדות האחרונים שלה במקום לגלות אותם במורד הזרם שדות נוספים מעבר לכותרת מקבלים שמות עמודות גנריים כך ששום דבר לא יאבד, והאזהרה אומרת לך בדיוק כמה שורות הושפעו, וזה בדרך כלל מספיק כדי לעקוב אחר הבעיה חזרה למפריד תועה במקור אם אתה רוצה לבדוק קובץ מבולגן לפני המרתו, ה מציג CSV מציג אותו כטבלה עם אותו מנתח סובלני, שזו לרוב הדרך המהירה ביותר לזהות מפריד תועה או ציטוט לא סגור לפני שהוא הופך לפלט פגום.
היכן שממיר CSV ל-XML מתאים לכל השאר
המרת נתונים היא לעתים רחוקות קפיצה בודדת. ייתכן שאותו CSV שצריך להפוך ל-XML היום יצטרך להפוך ל-JSON מחר עבור REST API, או אצווה של תוספות SQL עבור טעינת מסד נתונים. ה ממיר CSV ל-JSON מטפל ביעד JSON עם אותו מנתח RFC 4180, וה- ממיר CSV ל-SQL הופך את אותן שורות להצהרות הוספה. when the data is already XML and you need to go the other way, the ממיר XML ל-JSON וה ממיר JSON ל-XML כסה את שני הכיוונים של גבול ה-XML-JSON, והם משתמשים באותן מוסכמות תכונות וטקסט שהכלי הזה עוקב אחריהם, כך שהנסיעה הלוך ושוב ניתנת לחיזוי.
לתמונה הרחבה יותר, ה מדריך CSV ל-JSON חופר עמוק יותר בניתוח אותו יצוא מבולגן, ה מדריך JSON ל-XML מסביר את מיפוי האלמנטים והתכונות מהצד של JSON, ואת פרטיות נתונים בכלים מקוונים מאמר מסביר מדוע עושה את כל זה בדפדפן משנה כאשר CSV מחזיק שמות וכתובות דואל כמו כל דבר על Toolz.dev, הממיר פועל כולו בדפדפן שלך, כך הנתונים שאתה ממיר לעולם לא עוזב את המכונה שלך.
שאלות נפוצות
כיצד אוכל להמיר קובץ CSV ל-XML?
הדבק את ה-CSV בתיבת הקלט, אשר את הגדרות המפריד והכותרת ולחץ על המר ל-XML. השורה הראשונה נקראת כשמות העמודות, וכל שורה הבאה הופכת לרכיב XML שתגי הילד שלו נקראים על שם העמודות הללו. לאחר מכן תוכל להעתיק את התוצאה או להוריד אותה כקובץ.xml.
מה קורה לשורת הכותרת של CSV?
כאשר " השורה הראשונה היא header" פועל, תאי הכותרת הופכים לשמות רכיבי ה-XML עבור כל שורת נתונים. שמות מחוטאים לתגיות XML חוקיות, אז "First Name" הופך ל-First_Name ושם של עמודה כפולה עם סיומת מספרית. אם תכבה את אפשרות הכותרת, העמודות נקראות עמודה_1, עמודה_2 וכן הלאה.
האם כל תא צריך להיות אלמנט או תכונה?
זה תלוי במערכת שקוראת את ה-XML. מצב אלמנט כותב מבנה קריא שניתן לקינון עם תג אחד לכל ערך, בעוד שמצב תכונה ממוטט שורה לאלמנט קומפקטי יחיד עם תכונה אחת לכל עמודה. ממיר זה תומך בשניהם, אז בחר את זה שהסכימה או יעד הייבוא שלך מצפים לו; אלמנטים הם ברירת המחדל הבטוחה יותר כאשר אינך בטוח.
האם הממיר מטפל בפסיקים בתוך ערך?
כן. בעקבות RFC 4180, ערך המכיל פסיק, ציטוט כפול או הפסקת שורה עטוף במירכאות כפולות ב-CSV, וציטוט מוטבע נכתב כשני ציטוטים. המנתח קורא את השדות המצוטטים האלה כערך בודד במקום לפצל אותם, אז "Hopper, Grace" נשאר באלמנט אחד.
אילו תוחמים נתמכים?
פסיק, נקודה-פסיק, לשונית וצינור כברירת מחדל הכלי מזהה אוטומטית את המפריד על-ידי בחירת זה שמייצר מספר עקבי של עמודות על פני מספר השורות הראשונות, המטפל בצורה נכונה בקבצי נקודה-פסיק אירופיים וביצוא מופרד כרטיסיות. אתה יכול גם לבחור את המפריד באופן ידני.
מדוע חלק משמות העמודות שלי משתנים ב-XML?
שמות רכיבי XML אינם יכולים להכיל רווחים או את רוב סימני הפיסוק ואינם יכולים להתחיל בספרה או במקף הממיר מחליף תווים לא חוקיים בקו תחתון וקידומות שם שמתחיל בספרה, כך שהפלט תמיד מעוצב היטב הנתונים המקוריים בכל תא לעולם אינם משתנים, רק שמות התג.
האם נתוני ה-CSV שלי מועלים לשרת?
מס 'המרה כולה פועלת בדפדפן שלך עם JavaScript. שום דבר שאתה מדביק מועבר, נרשם או מאוחסן, והכלי ממשיך לעבוד ללא חיבור לרשת לאחר שהדף נטען, מה ששומר על שמות, מיילים ונתונים אחרים ב - CSV שלך פרטיים.
האם אוכל להמיר XML בחזרה ל-CSV או ל-JSON?
כלי זה ממיר CSV ל-XML. כדי לעצב מחדש את הנתונים לכיוון השני, השתמש בממיר XML ל-JSON, והשתמש בממיר CSV ל-JSON כאשר JSON ולא XML הוא היעד שלך. כולם פועלים בצד הלקוח עם אותן ערבויות פרטיות.



