Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET IsValidXml扩展方法性能_C#_.net_Xml_Validation_Xml Validation - Fatal编程技术网

C# .NET IsValidXml扩展方法性能

C# .NET IsValidXml扩展方法性能,c#,.net,xml,validation,xml-validation,C#,.net,Xml,Validation,Xml Validation,我继承了一个遗留应用程序,它将大量XML作为字符串传递 我经常需要能够检查字符串是否是有效的XML。检查字符串在.NET中是否为有效XML的最快和最便宜的方法是什么 我在.NET3.5中工作,在解决方案中的这个项目中,我很可能会使用它作为扩展方法(脱离字符串) 更新: 我所说的“有效”是指格式正确的XML。我不需要验证资源或模式。我不知道.NET中有内置的工具,可以在不解析XML的情况下验证XML的格式(?)。考虑到这一点,类似的方法应该会奏效: public static class XmlU

我继承了一个遗留应用程序,它将大量XML作为字符串传递

我经常需要能够检查字符串是否是有效的XML。检查字符串在.NET中是否为有效XML的最快和最便宜的方法是什么

我在.NET3.5中工作,在解决方案中的这个项目中,我很可能会使用它作为扩展方法(脱离字符串)

更新

我所说的“有效”是指格式正确的XML。我不需要验证资源或模式。

我不知道.NET中有内置的工具,可以在不解析XML的情况下验证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;
        }
    }
}

同意Adam和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;
        }
    }
}

如果不对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();
    }
static void Main(字符串[]args)
{
常数int迭代次数=20000;
常量字符串xml=@“;
秒表st=新秒表();
st.Start();

对于(int i=0;在您的情况下,i什么是“有效的”?您是指格式正确,还是希望它与DTD/模式匹配?这是否意味着您需要能够解析引用的资源?好的观点。我将修改我的问题。我想知道我是否应该调用我的方法isPropertyXML?还是IsWellFormedXml?在这个级别上,听起来像是
IsXml
可以工作(IMHO)。这些术语有特定的含义:如果字符串符合XML的语法规则,即如果它是XML文档,则它的格式正确。如果XML文档符合DTD或架构,则它是有效的。所有有效的XML文档都是格式正确的。@Steven,请不要以从根本上改变其工作方式的方式编辑答案。捕获所有答案,除非ions是有意的,也是合适的。虽然它可以更具体,只捕获
XmlException
,但将其更改为使用
DebuggerStepThrough
是完全不同的。为什么有人要编辑已回答问题的答案,通过更改代码的含义……发表评论可能会更友好在我看来!