web-dev-qa-db-ja.com

.LoadXml()を呼び出す前に、文字列入力で有効なxmlを確認する方法

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

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

例外をキャッチしてください。例外をキャッチすることによる小さなオーバーヘッドは、XMLの解析に比べてdrれます。

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

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }
60
Rasmus Faber

独自のValidationEventHandlerを提供すると、XmlValidatingReaderを使用して例外を防ぐことができます。

10
Sunny Milenov

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

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

6
Dan

キャッチが多すぎる場合は、XMLスキーマを使用してXMLを事前に検証し、XMLが正常であることを確認することをお勧めしますが、キャッチするよりもおそらく悪いでしょう。

3

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

1