44

例外をキャッチせずに、LoadXml()この結果をロジックの一部として使用することなく、これを実行することをお勧めします。自分でxmlを手動で解析する必要のないソリューションのアイデアはありますか? XmlException をスローする代わりに、VB はこの関数に対して false の戻り値を持っていると思います。Xml 入力はユーザーから提供されます。どうもありがとう!

if (!loaded)
{
     this.m_xTableStructure = new XmlDocument();
     try
     {
          this.m_xTableStructure.LoadXml(input);
          loaded = true;
     }
     catch
     {
          loaded = false;
     }
}
4

5 に答える 5

68

例外をキャッチするだけです。XML の解析に比べて、例外をキャッチすることによるわずかなオーバーヘッドは無視されます。

関数が必要な場合 (パフォーマンスのためではなく、スタイル上の理由から)、自分で実装します。

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }
于 2008-09-17T18:52:03.990 に答える
10

独自の ValidationEventHandler を提供する場合、XmlValidatingReader を使用すると例外が回避されます。

于 2008-09-17T18:51:03.303 に答える
6

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 も機能しませんでした。

誰でも正規表現で成功しますか?

于 2009-11-12T05:41:07.100 に答える
3

キャッチが多すぎる場合は、XMLスキーマを使用して、事前にXMLを検証し、XMLに問題がないことを確認することをお勧めしますが、キャッチよりも悪い可能性があります。

于 2008-09-17T18:56:03.933 に答える
1

すでに述べたように、私はむしろ例外をキャッチしたいのですが、 XmlParserContextを使用すると、「手動で」解析して異常をインターセプトすることができます。ただし、1秒あたり100個のxmlフラグメントを解析しているのでない限り、例外をキャッチしないのはなぜですか?

于 2008-09-17T18:54:18.553 に答える