2017-01-20 3 views
0

私は検証する必要があるXMLファイルがあります。行番号に "Ln"というタグを追加しました。エラー番号リストの一部として検証エラーがある場合、この行番号を返そうとしています。私はそれを検証するために、次のコードを使用しC#でxml検証の行番号を取得

<employees> 
    <employee> 
     <firstName>John</firstName> <lastName>Doe</lastName><Ln>0</Ln> 
    </employee> 
    <employee> 
     <firstName>Anna</firstName> <lastName>Smith</lastName><Ln>1</Ln> 
    </employee> 
    <employee> 
     <firstName>Peter</firstName> <lastName>Jones</lastName><Ln>2</Ln> 
    </employee> 

</employees> 

::私は文字列のリストとしてエラーリストを返したいと、最も重要なのは行番号が含まれます

System.Xml.Schema.XmlSchemaSet schemas = new System.Xml.Schema.XmlSchemaSet(); 
    schemas.Add("", @"Path to xsd"); 
    Console.WriteLine("Attempting to validate"); 
    XDocument UsrDoc = XDocument.Load(@"My xml file"); 
    bool errors = false; 
    UsrDoc.Validate(schemas, (o, e) => 
         { 
          Console.WriteLine("{0}", e.Message); 
          errors = true; 
         }); 
    Console.WriteLine("UsrDoc {0}", errors ? "did not validate" : "validated"); 
    Console.WriteLine(); 

ここに私のxmlです。私はこれまでどのようにして失敗しているのか把握しています。

すべてのヘルプは高く評価されます。 ValidationEventArgsから

B

答えて

0

XmlSchemaExceptionは行番号を有しています。 を参照してください:あなたのコード内https://msdn.microsoft.com/de-de/library/system.xml.schema.xmlschemaexception(v=vs.110).aspx

UsrDoc.Validate(schemas, (o, e) => 
    { 
     Console.WriteLine("Line {0}: {1}", e.Exception.LineNumber, e.Message); 
     errors = true; 
    }); 

なようにLinePositionやなど他の有用な情報は、もあります。

EDIT:文字列のリストが必要だと読んだだけです。この場合、イベントハンドラでこのリストを作成するか、必要な情報を別のメソッドに渡す必要があります。しかし、検証プロセスが最初のエラーの後も継続するかどうかはわかりません。多分、あなたはそれを稼働させ続けるための特定の設定をしなければならないでしょう。

+0

行番号を検証するためにXmlReaderを使用常に0 hummmです。 –

1

私は

using (var stream = new FileStream("My xml file", FileMode.Open)) 
{ 
    var isErrorOccurred = false; 

    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.Schemas.Add("", "my schema"); 
    settings.ValidationEventHandler += (sender, args) => 
    { 
     isErrorOccurred = true; 
     Console.WriteLine("{0}", args.Exception.LineNumber);; 
    }; 

    stream.Seek(0, SeekOrigin.Begin); 
    XmlReader reader = XmlReader.Create(stream, settings); 

    // Parse the file. 
    while (reader.Read()) 
    {} 
    if (isErrorOccurred) 
     // do something 
}