3

多くの XML を文字列として渡す従来のアプリケーションを継承しました。

String が有効な XML かどうかを確認する機能が必要になることがよくあります。文字列が .NET で有効な XML であるかどうかを確認する最も高速で安価な方法は何ですか?

私は.NET 3.5で作業しており、ソリューション内のこの1つのプロジェクトでこれを拡張メソッド(文字列から)として使用する可能性が最も高いです。

UPDATE :
私の場合、「有効」とは、適切に形成された XML のことです。リソースやスキーマを検証する必要はありません。

4

3 に答える 3

2

XML の形式 (?) を解析せずに検証する .NET の組み込み機能については知りません。それを考えると、次のようなものが機能するはずです:

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;
        }
    }
}
于 2010-04-08T14:30:22.670 に答える
2

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;
        }
    }
}
于 2010-04-08T14:34:04.583 に答える
1

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では、どの代替手段よりもほぼ2倍高速です。意味あり。Reflector を使用してチェックしたことはありませんが、 、 、およびすべてがボンネットの下で使用されていなかったらXmlDocument、非常に驚​​くでしょう。XDocumentXPathDocumentXmlReader

于 2010-04-09T07:44:51.740 に答える