איך לעצב פרשן XML?

ASP zone

New member
איך לעצב פרשן XML?

מה העיצוב הכי יעיל לפרשן כזה? לעבור שורה שורה? אבל באופן תאורטי אפשר לכתוב קובץ XML בשורה אחת. לחפש > ו<? אבל מה עם מה שבאמצע? (טקסט אם זה אלמנט) איך אני בודק שגיאות? למישהו יש רעיון?
 
XML פרסר

בהנחה שאתה מתכוון לXML פרסר - קוד שמקבל XML כמחרוזת ויודע להבנות ממנו אובייקט. תתחיל מלזהות את התגים (<>). אין משמעות לשורות בXML, פשוט תתטען את כל הXML לstring אחד ותתחיל לרוץ עליו תו תו. יצא לי לעבוד במקום שכתבו בו קוד כזה. זה היה בשביל גרסה ישנה של Netscape שהתחייבנו לתמוך בה, ולא היה אפשרות להשתמש בDOM אז כתבנו פרסר בJavascript.
 

ייוניי

New member
אולי Regular Expression

אבל באמת שאפשר לעשות את זה בהמון דרכים... יש גם שיטה שנקראית Interpreter Pattern ואולי תעזור לך
 
יש שתי שיטות

האחת היא DOM השנייה היא SAX ב-DOM הרעיון הוא לטעון את כל האלמנטים לתוך Tree לפי התקן של W3C ואילו ב-SAX העניין עובד דרך אירועים : לעבור על כל המידע כאשר נפתח תגית לקרוא לאירוע openElement כאשר נסגרת תווית לקרוא ל-closeElement... מידע על SAX יש כאן: http://sax.sourceforge.net/event.html
 

עידו פ

New member
על infix notation שמעת ?

הרעיון מאחורי פרסור (parsing) של XML דומה בבסיסו לפרסור של ביטוי מתמטי עם סוגריים הרעיון : מגדירים 3 מרכיבים - איבר פותח, איבר סוגר וביטוי שיכול להיות ביטוי פשוט או ביטוי מורכב (מורכב מאיבר פותח, מביטוי ומסוגר).בהקשר של ביטוי מתמטי זה די פשוט - האיבר הפותח והסוגר הם סימני הסוגריים. בביטוי XML-י, יש יותר מאיבר פותח אחד (כל element הוא איבר פותח אפשרי) אבל לכל איבר פותח יש רק איבר סוגר אחד שמתאים לו. הביטוי בין האיברים יכול להיות ביטוי פשוט (במקרה של ביטוי מתמטי - איזשהו חישוב כגון 1 2, במקרה של XML - רשימת מאפיינים - attributes) אך יכול להיות גם ביטוי מורכב הכולל בתוכו איבר פותח, ביטוי (פשוט/מורכב) ואיבר סוגר. לדוגמה :
<root> - איבר פותח <x> - איבר פותח (חלק מביטוי מורכב) <y/> - איבר פותח ואיבר סוגר (חלק מביטוי מורכב) </x> - איבר סוגר (חלק מביטוי מורכב) </root> - איבר סוגר​
הרעיון בפיענוח של מבנה כזו הוא די פשוט - כל איבר פותח שמגיע, מכניסים למחסנית, כל איבר סוגר שמגיע בודקים אם האיבר הפותח שלו הוא העליון במחסנית (כשהאיבר הסוגר ב-XML יכול להיות אלמנט סוגר או </). אם האיבר העליון במחסנית אינו מתאים לאיבר הסוגר - ה-XML לא תקין (קינון לא תקין). אם יש בידך איבר סוגר ולא קיימים איברים במחסנית - ה-XML לא תקין (סוגר ללא פותח). את הטיפול במאפיינים אפשר לעשות בצורה דומה. כל מאפיין מורכב מאיבר פותח (שם המאפיין,הסימן שווה = ואולי גם גרשיים), מאיזשהו ערך ומאיבר סוגר (גרשיים, רווח או כלום במידה והאיבר הבא הוא איבר סוגר של ה-element). זה על רגל אחת. אני מניח שזה נשמע קצת מסובך, אבל אם תנסה להקביל את מבנה ה-XML למבנה של ביטוי מתמטי (עם סוגריים), תראה שזה נהיה יותר מובן וקל לתכנון (אני מניח שאם תחפש באינטרנט infix notation תמצא לא מעט יישומים של אלגוריתם זה). אם צריך איזשהי הבהרה, אני כאן.
 

עידו פ

New member
אם קראתי נכון את המאמר שהפנת אליו

ה-SAX אינו מטפל בזיהוי השגיאות אלא רק באירועים הקשורים להתחלה וסוף של אלמנטים, כך שהטיפול במידע מהפרסור עדין צריך להיות מבוצע באמצעות איזשהו אלגוריתם
 
צודק...

(אני חושב...) המחלקות שחבלית ה-SAX מספקת כוללת ביניהם גם XMLParser ו-XMLReader
 
element לפי ההגדרה של W3C

זה סוג של Node (אלמנט יורש מנוד) אז אתה הולך על מבנה ה-DOM ?
 

עידו פ

New member
אם זכור לי נכון

כשאומרים node מתכוונים לכל "אובייקט" שקיים ב-XML, בין אם זה element, attribute וכו'. אני מניח שאפשר לזהות אלמנט ע"י כך שהוא מתחיל ב-> ואילו מאפיין (attribute) אינו מתחיל ב-> אלא מתחיל באות (a-z A-z) שלאחריה אותיות או ספרות שלאחריהן מופיע התו שווה (=). באיזו סביבת פיתוח אתה עובד שאין לה רכיבים מובנים לטיפול ב-XML ?
 

ASP zone

New member
DevC++

ומה שיש עד עכשיו אני לא אוהב. חוץ מזה אני חייב לדעת איך מעצבים פרשן מתישהו לא?
 
הוא התכוון לדעתי עם איזה שפה

ל-C++ יש את Xerces ואת MSXML.DOMDocument... http://xml.apache.org/xerces-c/ ב-JAVA יש לך את JDOM ו-JSAX (חבילות...) כדי לכתוב מפרש XML צריך לדעת קודם כל XML על בוריו (כלומר גם טכנולוגיות נלוות כמו XSL ו-DOM...)
 

ASP zone

New member
אני יודע XML אל תדאג

ואני ממש לא אוהב את xerces או את MSXML.DOMDocument לC++ הם מאוד מסורבלים. אבל כמו שאמרתי אני רוצה ללמוד לתכנת פרשן.
 

liorsh

New member
נושא לא פשוט, אם עושים את זה נכון

אתה רוצה לבנות מנתח לקסיקלי (מבני) לשפה. במקרה הזה השפה היא XML, אבל העקרון דומה בכל מקרה. לבנות XML parser רק ע"י ניתוח של מחרוזות, ולעשות אותו טוב, ובצורה מלאה, זה מאוד מאוד קשה. תנסה לחשוב על פרסר לתוכנית C או Java שבנוי רק על מחרוזות. השיטה כבר קיימת מזמן, ויש כלים נוחים שעוזרים לעשות את זה. בד"כ, זה אחד הנושאים הבסיסיים בקורס קומפילציה באוניברסיטה. עושים את זה ע"י שימוש בכלי שנקרא lex (וניתוח סמנטי - החלק השני של קומפילציה - מתבצע ע"י כלי שנקרא yacc). על רגל אחת, אתה צריך להגדיר דקדוק שיתאים ל XML (ואני בטוח שיש כאלה באינטרנט), להזין אותו לכלי ה lex שלך (יש המון גרסאות שלו) ומה שתקבל בתוצאה יהיה ניתוח מבני של המחרוזת שלך. כאמור, זה על רגל אחת, ומאוד מאוד פשטני, אבל מה לעשות, זאת הדרך לעשות את זה בצורה מלאה. מקווה שעזרתי, ליאור
 
למעלה