سؤال
أضع الكثير من الوقت في محاولة لمعرفة كيفية استخدام HXT. ما زلت أتعامل مع أمثلة باستخدام deep
. ماذا فعلت deep
فعل؟
فمثلا، هذا الرمز لديه ما يلي:
atTag tag = deep (isElem >>> hasName tag)
-- case-insensitive tag matching
atTagCase tag = deep (isElem >>> hasNameWith ((== tag') . upper . localPart))
where tag' = upper tag
upper = map toUpper
المحلول
http://hackage.haskell.org/packages/archive/hxt/latest/doc/html/control-arrow-arrowtree.html#v:deep
deep :: Tree t => a (t b) c -> a (t b) cSource
يبحث بشكل متكرر عن شجرة كاملة عن الأشجار الفرعية ، والتي يحملها المسند. يتم إجراء البحث من أعلى لأسفل. عند العثور على شجرة ، يصبح هذا عنصرًا في قائمة النتائج. لم يتم فحص الشجرة التي تم العثور عليها بشكل أكبر لأي مرحلة ، والتي يمكن أن يحملها المسند أيضًا. نرى
multi
لهذا النوع من البحث.مثال:
deep isHtmlTable
يختار جميع عناصر جدول المستوى الأعلى في مستند (مع تعريف مناسب لـisHtmlTable
) ولكن لا توجد جداول تحدث داخل خلية الجدول.
يمكنك العثور على الوثائق المعطاة اسم وظيفة أو توقيع اكتب مع هوول أو هايو!
في الأساس ، إذا كانت شجرة XML مثل
<p>
<strong id="a">
<em id="b">
<strong id="c">
foo
</strong>
</em>
</strong>
<ins id="d">
<strong id="e">
bar
</strong>
<em id="f">
baz
</em>
</ins>
</p>
deep (isElem >>> hasName "strong") tree
سيعود قائمة ل
<strong id="a">
<strong id="e">
لأننا يمكننا أن نجد هذين <strong>
ق عند المشي في الشجرة ، بينما (isElem >>> hasName tag) tree
سيعود قائمة فارغة لأن جذر الشجرة هو <p>
, ، ليس أ <strong>