0

XSd に対して xml ファイルを検証するためのアプリケーションを構築します。あるノードでエラーが発生した場合、例外がスローされます。その例外では、行番号と行位置のみを取得できます。そのノードの maxlength 値を取得する方法。

            MemoryStream xml = new MemoryStream();
            string xsd;
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add("", Application.StartupPath + "\\std_imaging.xsd");
            settings.ValidationEventHandler += MyValidationEventHandler;

            var v = XmlReader.Create(filename, settings);

            while (v.Read())
            {
                string a1 = v.ValueType.Name.Length.ToString();
                string name = v.NodeType + v.Name + v.ValueType + v.Value.ToString();
            }

       public void MyValidationEventHandler(object sender, ValidationEventArgs args)
       {
             schemaResult = false;
             textBox1.Text = textBox1.Text + (Environment.NewLine + args.Message +     
             Environment.NewLine +      "Location(" + args.Exception.LineNumber + 
             "," + args.Exception.LinePosition + ")" + Environment.NewLine);
       }

    this is my code.
4

1 に答える 1

0

少し前に同じ問題に遭遇し、特定のノードのスキーマ情報を取得するのは思ったほど簡単ではないことを知りました。この情報が必要な理由と、簡単な解決策ではないため、時間をかける価値があるかどうかを確認することをお勧めします.

これが非常に必要であり、将来的に必要な場合、最適な解決策は、オブジェクト モデルを直接操作して、IXmlSchemaInfo必要なスキーマ情報を読み取ることができるようにすることです。次の質問と、受け入れられた回答のこのブログ投稿を見てください。

C# で、要素の XSD 定義の MaxLength を決定する方法

IXmlSchemaInfoオブジェクト モデルについて多くのことがわかります。基本的に、多くの型チェックとキャストが必要です。を使用しているため、 はリーダーの一部でXmlReaderあるSchemaInfo必要があるため、現在のノードのスキーマ情報を取得できます。

このブログでは、任意のノードのスキーマ情報を読み取る方法を示しており、実際にはそれをすべての検証に結び付けるわけではありませんが、Validation コールバック メソッド内で機能するように簡単に適応させることができます。

public void MyValidationEventHandler(object sender, ValidationEventArgs args)
{
    // Using `getMaxLength` method from blog code will return a list of max 
    //  lengths.  If there is more than one, you need to decide how to handle it.
    //  It would also be a good idea to add some addition null checking
    List<int> maxLengths = getMaxLength(sender as XmlReader);

    schemaResult = false;
    textBox1.Text = textBox1.Text + (Environment.NewLine + args.Message +     
        Environment.NewLine + "Location(" + args.Exception.LineNumber + 
        "," + args.Exception.LinePosition + ")" + Environment.NewLine);

}
于 2012-05-22T13:19:26.537 に答える