كيفية استخدام دالة XPath في XPathExpression سبيل المثال برمجيا?

StackOverflow https://stackoverflow.com/questions/402211

  •  03-07-2019
  •  | 
  •  

سؤال

بلدي الحالي البرنامج تحتاج إلى استخدام برمجيا إنشاء XPathExpression سبيل المثال لتطبيق XmlDocument.Xpath يحتاج إلى استخدام بعض XPath وظائف مثل "ينتهي مع".ومع ذلك, لا أستطيع العثور على طريقة لاستخدام "ينتهي مع" في XPath.أنا

فإنه رمي استثناء مثل أدناه

حدث استثناء غير معالج:النظام.Xml.XPath.XPathException:مساحة المدير أو XsltC ontext الحاجة.هذا الاستعلام يحتوي على بادئة ، متغير أو دالة معرفة من قبل المستخدم.
في السيدة الداخلية.Xml.XPath.CompiledXpathExpr.get_QueryTree() في النظام.Xml.XPath.XPathNavigator.تقييم(XPathExpression expr, XPathNodeIt erator السياق)
في النظام.Xml.XPath.XPathNavigator.تقييم(XPathExpression expr)

رمز مثل هذا:

    XmlDocument xdoc = new XmlDocument();
    xdoc.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
                        <myXml xmlns=""http://MyNamespace"" xmlns:fn=""http://www.w3.org/2005/xpath-functions""> 
                        <data>Hello World</data>
                    </myXml>");
    XPathNavigator navigator = xdoc.CreateNavigator();

    XPathExpression xpr;
    xpr = XPathExpression.Compile("fn:ends-with(/myXml/data, 'World')");

    object result = navigator.Evaluate(xpr);
    Console.WriteLine(result);

حاولت تغيير رمز لإدراج يتجاوز عند ترجمة التعبير ، مثل أدناه

    XmlDocument xdoc = new XmlDocument();
    xdoc.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
                        <myXml xmlns=""http://MyNamespace"" xmlns:fn=""http://www.w3.org/2005/xpath-functions""> 
                        <data>Hello World</data>
                    </myXml>");
    XPathNavigator navigator = xdoc.CreateNavigator();
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
    nsmgr.AddNamespace("fn", "http://www.w3.org/2005/xpath-functions");

    XPathExpression xpr;
    xpr = XPathExpression.Compile("fn:ends-with(/myXml/data, 'World')", nsmgr);

    object result = navigator.Evaluate(xpr);
    Console.WriteLine(result);

أنه فشل في XPathExpression.ترجمة الاحتجاج:

حدث استثناء غير معالج:النظام.Xml.XPath.XPathException:XsltContext هناك حاجة إلى هذا الاستعلام لأن من وظيفة غير معروفة.في السيدة الداخلية.Xml.XPath.CompiledXpathExpr.UndefinedXsltContext.ResolveFuncti في(سلسلة بادئة اسم سلسلة ، XPathResultType[] ArgTypes) في السيدة الداخلية.Xml.XPath.FunctionQuery.SetXsltContext(XsltContext السياق) في السيدة الداخلية.Xml.XPath.CompiledXpathExpr.SetContext(يتجاوز nsM anager) في النظام.Xml.XPath.XPathExpression.ترجمة(سلسلة xpath ، IXmlNamespaceResolv إيه nsResolver)

أي شخص يعرف خدعة استخدام الجاهزة XPath الوظائف مع XPathExpression.تجميع?شكرا

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

المحلول

وظيفة ends-with() لم يتم تعريف عن XPath 1.0 ولكن فقط من أجل XPath 2.0 و XQuery.

تستخدمه .صافي..صافي في هذا التاريخ لا تنفذ XPath 2.0, XSLT 2.0 أو XQuery.

واحد يمكن بسهولة بناء XPath 1.0 التعبير ، وتقييم التي تنتج نفس النتيجة مثل وظيفة ends-with():

$str2 = substring($str1, string-length($str1)- string-length($str2) +1)

تنتج نفس نتيجة منطقية (true() أو false()) مثل:

ends-with($str1, $str2)

في حالة ملموسة تحتاج فقط إلى استبدال حق التعبير عن $str1 و $str2.هم ، وفقا لذلك ، /myXml/data و 'World'.

لذا XPath 1.0 التعبير لاستخدام هذا هو ما يعادل XPath 2.0 التعبير ends-with(/myXml/data, 'World') هو:

'World' = 
   substring(/myXml/data,
             string-length(/myXml/data) - string-length('World') +1
             )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top