.LoadXml() を呼び出す前に文字列入力内の有効な XML をチェックする方法
-
01-07-2019 - |
質問
例外をキャッチせずにこれを実行したいと思います LoadXml()
そしてこの結果をロジックの一部として使用します。XML を自分で手動で解析する必要のない解決策のアイデアはありますか?VB では、この関数の戻り値が XmlException をスローする代わりに false になっていると思います。XML 入力はユーザーから提供されます。どうもありがとう!
if (!loaded)
{
this.m_xTableStructure = new XmlDocument();
try
{
this.m_xTableStructure.LoadXml(input);
loaded = true;
}
catch
{
loaded = false;
}
}
解決
例外をキャッチするだけです。例外をキャッチすることによる小さなオーバーヘッドは、XML の解析に比べて小さくなります。
(パフォーマンスのためではなくスタイル上の理由で) この関数が必要な場合は、自分で実装してください。
public class MyXmlDocument: XmlDocument
{
bool TryParseXml(string xml){
try{
ParseXml(xml);
return true;
}catch(XmlException e){
return false;
}
}
他のヒント
独自の ValidationEventHandler を提供する場合、XmlValidatingReader を使用すると例外が防止されます。
XmlValidatingReader と ValidationEventHandler を動作させることができませんでした。XMLException は、正しく形成されていない XML に対して引き続きスローされます。リフレクターを使用したメソッドを表示してこれを確認しました。
確かに、1 秒あたり数百の短い XHTML フラグメントを検証する必要があります。
public static bool IsValidXhtml(this string text)
{
bool errored = false;
var reader = new XmlValidatingReader(text, XmlNodeType.Element, new XmlParserContext(null, new XmlNamespaceManager(new NameTable()), null, XmlSpace.None));
reader.ValidationEventHandler += ((sender, e) => { errored = e.Severity == System.Xml.Schema.XmlSeverityType.Error; });
while (reader.Read()) { ; }
reader.Close();
return !errored;
}
XmlParserContext も機能しませんでした。
正規表現で成功した人はいますか?
キャッチするのが面倒な場合は、XML スキーマを使用して XML を事前に検証して、XML に問題がないことを確認するとよいでしょう。ただし、それはおそらくキャッチよりも悪いでしょう。
すでに述べたように、例外をキャッチしたいのですが、 XmlParserContext, 、「手動で」解析して異常を遮断しようとすることもできます。ただし、1 秒あたり 100 個の XML フラグメントを解析する場合を除き、例外をキャッチしないのはなぜでしょうか。