سؤال

هل هناك أي مكتبات جاهزة للإنتاج لتدفق تعبير التعبيرات XPath ضد وثيقة XML المقدمة؟ تظهر التحقيقاتي أن معظم الحلول الحالية تقوم بتحميل شجرة Dom-DOM في الذاكرة قبل تقييم تعبير XPath.

هل كانت مفيدة؟

المحلول

سيكون ذلك عمليا لتنفيذ XPath الكامل، بالنظر إلى أن بناء جملة XPath يسمح:

/AAA/XXX/following::*

و

/AAA/BBB/following-sibling::*

مما يعني متطلبات نظرة المستقبل؟ أي من عقدة معينة ستضطر لتحميل بقية المستند على أي حال.

الوثيقة ل نوكس مكتبة (على وجه التحديد streamingpathffilter.) يجعل هذه النقطة، والمراجع بعض التطبيقات التي تعتمد على مجموعة فرعية من XPath. يدعي Nux لأداء بعض إمكانية تدفق الاستعلام، ولكن بالنظر إلى ما ورد أعلاه سيكون هناك بعض القيود من حيث تنفيذ XPath.

نصائح أخرى

XSLT 3.0 يوفر وضع البث للمعالجة وهذا سيصبح معيارا مع مواصفات XSLT 3.0 W3C التي تصبح توصية W3C.

في وقت كتابة هذه الإجابة (مايو، 2011) يوفر ساكسون بعض دعم دفق XSLT 3.0 .

هناك العديد من الخيارات:

  • تقنيات DataDirect تبيع تطبيق XQuery التي توظف الإسقاط والتدفق، حيثما أمكن ذلك. يمكنها التعامل مع الملفات في نطاق متعدد غيغابايت - على سبيل المثال أكبر من الذاكرة المتوفرة. إنها مكتبة آمنة للخيط، لذلك من السهل الاندماج. جافا فقط.

  • سكسونية هو نسخة مفتوحة المصدر، مع ابن عم بأسعار متواضع أكثر تكلفة، والتي ستفعل البث في بعض السياقات. جافا، ولكن مع منفذ .NET أيضا.

  • marklogic. و يوجد هي قواعد بيانات XML التي، إذا تم تحميل XML فيها، فسوف تقوم بمعالجة Xpaths بطريقة ذكية إلى حد ما.

محاولة جوست.

على الرغم من أنني لا أملك أي تجربة عملية معها، فقد اعتقدت أنه جدير بالذكر QuixProc ( http://code.google.com/p/quixproc/ ). إنه نهج تدفق في XProc، ويستخدم المكتبات التي توفر دعم البث ل XPath من بين الآخرين ..

Fwiw، لقد استخدمت Nux Streaming تصفية الاستعلامات XPath ضد ملفات كبيرة جدا (> 3 جيجابايت)، وقد عمل كلاهما بلا عيوب واستخدام الذاكرة القليل جدا. كانت حالة استخدامي مختلفة قليلا (غير صحيحة)، لكنني أشجعك بشدة على منحها بالرصاص مع Nux.

أعتقد أنني سوف أذهب للحصول على رمز مخصص. مكتبة .NET تحصل على قريبة جدا من الهدف، إذا أراد المرء فقط قراءة بعض مسارات مستند XML.

نظرا لأن جميع الحلول التي أراها حتى الآن تحترم فقط مجموعة XPath الفرعية، فإن هذا هو أيضا هذا النوع من الحل. المجموعة الفرعية صغيرة حقا. :)

يقرأ هذا الرمز C # ملف XML وتهم العقد التي تعطى مسارا صريحا. يمكنك أيضا أن تعمل على سمات بسهولة، باستخدام xr["attrName"] بناء الجملة.

  int c = 0;
  var r = new System.IO.StreamReader(asArgs[1]);
  var se = new System.Xml.XmlReaderSettings();
  var xr = System.Xml.XmlReader.Create(r, se);
  var lstPath = new System.Collections.Generic.List<String>();
  var sbPath = new System.Text.StringBuilder();
  while (xr.Read()) {
    //Console.WriteLine("type " + xr.NodeType);
    if (xr.NodeType == System.Xml.XmlNodeType.Element) {
      lstPath.Add(xr.Name);
    }

    // It takes some time. If 1 unit is time needed for parsing the file,
    // then this takes about 1.0.
    sbPath.Clear();
    foreach(object n in lstPath) {
      sbPath.Append('/');
      sbPath.Append(n);
    }
    // This takes about 0.6 time units.
    string sPath = sbPath.ToString();

    if (xr.NodeType == System.Xml.XmlNodeType.EndElement
        || xr.IsEmptyElement) {
      if (xr.Name == "someElement" && lstPath[0] == "main")
        c++;
      // And test simple XPath explicitly:
      // if (sPath == "/main/someElement")
    }

    if (xr.NodeType == System.Xml.XmlNodeType.EndElement
        || xr.IsEmptyElement) {
      lstPath.RemoveAt(lstPath.Count - 1);
    }
  }
  xr.Close();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top