DCSIMG
Question from Tapuz .Net forum: Extracting data from an HTML File - Justin myJustin = new Justin( Expriences.Current );

Question from Tapuz .Net forum: Extracting data from an HTML File

שאלה:

מה הדרך הנכונה לעבודה מול תוכן XHTML?
לדוגמה אני טוען תכן xhtml מקובץ ורוצה לבצע בו מספר שינויים לפני שאני מציג אותו ללקוח.
מה שאני עושה כיום זה טוען אותו כxml ומשתמש במחלקות ממשפחת XmlDocument וXDocument, ויש בזה הרבה חסרונות. יש דרך טובה יותר? (Net 3.5.)

 

תשובה:

יש כמה אפשרויות, אבל אין ביניהן דרך טובה.

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

אופציה א' היא לעבוד איתו "כאילו" הוא XML.
למה "כאילו" כי HTML הוא 100% מהזמן לא XML תקני ויש תגיות של נסגרות שם למשל.
אז שלב א' הוא תמיד ביחס למסמך הספציפית מאוד שאתה צריך לטעון במסגרת התוכנה לדאוג לתקן אותו. השילוב הוא לרוב בין Replaceים רגילים של Stringים (למשל <br> להחליף ב-<br /> עם סוגר) ושימוש ב-Replaceים של Regexpים.
הדרך הכי טובה לגלות מה הבעיה עם HTML ספציפי כלשהו הוא פשוט לטעון אותו ולהתחיל לתקן עד שכל השגיאות נעלמות.

אחרי שהבאת את ה-HTML למצב של XML תקני, תבצע את שלב ב' שבו תטען אותו ל-XmlDocument ותבצע ביטויי XPath.
אני משתמש ב-SketchPath כדי להכניס לתוכו מסמך XML תקני והוא באמצעים גרפים דואג לרשום עבורי את הביטוי XPath הבסיסי.

אפשרות נוספת לשלב ב' שתגרום לך סיוטיים בלילה כאשר תראה את הסינטקס שלה היא לטעון אותו ל-XDocuemnt של XLinq ולבצע ביטויי פאסודו-Linq. אני ממליץ נגד האפשרות הזאת כי בכל שלב בדרך תצטרך להמיר כל דבר למחרוזת מה שהופך את הסינטקס ללא קריא בעליל.

אם אתה צריך משהו יותר כללי מ"תיקון HTML ל-XML וביצוע שאילתות עליו" יש ספריות מוכנות שמאפשרות לטעון קובץ HTML ולקרוא אותו אלמנט אלמנט. מניסיון, אף אחת מהספריות לא ברמה טובה מספיק כדי לאפשר פתרונות מסחריים.

פעם שקלתי לבסס על זה Custom Workflow Element ב-Workflow Foundation שיהיו סה"כ לבני לגו שזורקים על טופס לפי הסדר שמצפים לאלמנטים להופיע ושמוצאים אלמנטיים ספציפיים אפשר לעלות אירועים.

 

קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=110845521

Published Tuesday, January 15, 2008 12:30 PM by Justin-Josef Angel [MVP]

Comments

No Comments