私は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の解析に比べてdrれます。
関数が必要な場合(パフォーマンスのためではなく、スタイル上の理由で)、自分で実装します。
public class MyXmlDocument: XmlDocument
{
bool TryParseXml(string xml){
try{
ParseXml(xml);
return true;
}catch(XmlException e){
return false;
}
}
独自のValidationEventHandlerを提供すると、XmlValidatingReaderを使用して例外を防ぐことができます。
XmlValidatingReaderとValidationEventHandlerを機能させることができませんでした。 XmlExceptionは、不正な形式のxmlに対して引き続きスローされます。リフレクターを使用してメソッドを表示して、これを検証しました。
実際、毎秒数百の短い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フラグメントを解析しているのでない限り、例外をキャッチしないのはなぜですか?