.純IsValidXml拡張手法の性能
-
25-09-2019 - |
質問
い遺産を用いを継承することだと多くのXMLなどの文字列です。
私はしばしば必要とする機能をチェックの場合の文字列が有効である形式をサポートしています。何が最速かつ最も高価なチェックする場合は文字列は有効なXML。います。
仕事をしています。純3.5れやこれを拡張手法(offの文字列)をこのプロジェクト内のソリューションとなります。
更新:
うのは、"有効"の場合は正常に形成されたコンポーネントです。んなを検証する資源やスキーマ.
解決
することはできませんの正当性を検証する整形式のXML文字列でなく構文解析します。簡単なベンチマークとインターネットには想像もつかな文字列を解析がで有効です(実際にインターネットには想像もつかな構文の特定の文字列のIとして利用してテストケース)は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;
}
}
}
所属していません StackOverflow