سؤال

لديّ تطبيق قديم ورثته يمرر الكثير من XML كأسلاك.

غالبًا ما أحتاج إلى القدرة على التحقق مما إذا كانت السلسلة ستكون صالحة XML. ما هي الطريقة الأسرع والأقل تكلفة للتحقق مما إذا كانت السلسلة صالحة XML في .NET؟

أنا أعمل في .NET 3.5 ، ومن المرجح أن أستخدم هذا كطريقة تمديد (خارج السلسلة) في هذا المشروع واحد ضمن الحل.

تحديث:
ما أعنيه بـ "صالح" في حالتي تم تشكيل XML بشكل صحيح. لست بحاجة إلى التحقق من صحة الموارد أو المخطط.

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

المحلول

لا يمكن التحقق من صحة التكوين الجيد لسلسلة XML دون تحليلها. ويوضح المعيار السريع أن أسرع طريقة لتحليل سلسلة لمعرفة ما إذا كانت صالحة (في الواقع أسرع طريقة لتحليل السلسلة المعينة التي أستخدمها كحالة اختبار) هي مع XMLReader:

    static void Main(string[] args)
    {
        const int iterations = 20000;
        const string xml = @"<foo><bar><baz a='b' c='d'/><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo><foo><bar><baz a='b' c='d'/></bar><bar/></foo></bar><bar/></foo>";

        Stopwatch st = new Stopwatch();

        st.Start();
        for (int i=0; i<iterations; i++)
        {
            using (StringReader sr = new StringReader(xml))
            using (XmlReader xr = XmlReader.Create(sr))
            {
                while (xr.Read())
                {
                }
            }
        }
        st.Stop();
        Console.WriteLine(String.Format("XmlReader: {0} ms.", st.ElapsedMilliseconds));

        st.Reset();
        st.Start();
        for (int i=0; i<iterations; i++)
        {
            XElement.Parse(xml);
        }
        st.Stop();
        Console.WriteLine(String.Format("XElement: {0} ms.", st.ElapsedMilliseconds));

        st.Reset();
        st.Start();
        for (int i = 0; i < iterations; i++)
        {
            XmlDocument d= new XmlDocument();
            d.LoadXml(xml);
        }
        st.Stop();
        Console.WriteLine(String.Format("XmlDocument: {0} ms.", st.ElapsedMilliseconds));

        st.Reset();
        st.Start();
        for (int i = 0; i < iterations; i++)
        {
            using (StringReader sr = new StringReader(xml))
            {
                XPathDocument d = new XPathDocument(new StringReader(xml));                    
            }
        }
        st.Stop();
        Console.WriteLine(String.Format("XPathDocument: {0} ms.", st.ElapsedMilliseconds));

        Console.ReadKey();
    }

على جهازي XmlReader ما يقرب من ضعف أسرع من أي من البدائل. هذا يبدو منطقيا. على الرغم من أنني لم أستخدم العاكس للتحقق ، إلا أنني سأفاجأ جدًا إذا XmlDocument, XDocument, ، و XPathDocument لم يكن كل استخدام XmlReader تحت الغطاء.

نصائح أخرى

لست على دراية بمرفق مدمج في .NET للتحقق من صحة (؟) من XML دون تحليله. بالنظر إلى ذلك ، يجب أن يعمل شيء من هذا القبيل:

public static class XmlUtilities
{
    public static bool IsXml(this string data)
    {
        if (string.IsNullOrEmpty(data)) return false;

        try
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

            doc.LoadXml(data);

            return true;            
        }
        catch
        {
            return false;
        }
    }
}

أتفق مع آدم ، ونسخة Xelement:

public static class XmlUtilities
{

    public static bool IsXml(this string data)
    {
        if (string.IsNullOrEmpty(data)) return false;

        try
        {
            var doc = XElement.Parse(data)

            return true;            
        }
        catch (XmlException)
        {
            return false;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top