2016-10-18 32 views
0

以下はXMLです。エラーが発生した行番号に基づいてレコード/行番号を取得しようとしています。たとえば、行6の値0.53で検証エラーが発生した場合は、レコード番号が1であることを知りたければ、id="1", id="2"などをrecordに追加するのは良い選択ですが、変更する。エラー行番号に基づいてXMLレコード番号を取得するC#

<?xml version='1.0' encoding='utf-8'?> 
<records> 
    <record> 
    <date>2016-02-01</date> 
    <id>3</id> 
    <value>0.53</value> 
    <unit>mtrs</unit> 
    </record> 
    <record> 
    <date>2016-02-01</date> 
    <id>4</id> 
    <value>0.13</value> 
    <unit>mtrs</unit> 
    </record> 
    <record> 
    <date>2016-02-01</date> 
    <id>7</id> 
    <value>0.13</value> 
    <unit>mtrs</unit> 
    </record> 
</records> 

後、私は次のようなアプローチを試してみてくださいIXmlLineInfo

​​

答えて

1

を使用してエラー行の情報を取得しています、私のコードです。

検証の前に、ドキュメントをロードした後、各record要素のインデックスとIDに関する情報を含む辞書を作成します。

XDocument document = XDocument.Load(...); 

var dict = document.Root.Elements("record") 
    .Select((r, index) => new { r, index }) 
    .ToDictionary(a => a.r, a => a.index); 

その後、私は非一意のID値をしようとしている可能性がある検証する前に辞書に値を追加する場合、小さな問題が、ありValidateイベントに

if (item != null && item.HasLineInfo()) 
{ 
    Message = dict[((XObject)item).Parent] + ";" + 
     item.LineNumber + ";" + 
     (((XObject)item).Parent.Element("id")).Value + ";" + 
     ((XElement)item).Name.LocalName + ";" + 
     args.Message + Environment.NewLine; 

    lstErrors.Add(Message); 
} 
+0

をこの辞書を使います取得して例外をスローします。 validateイベント中または実行後にこれを実装する方法はありますか? – Srini

+1

@Srini - 更新を参照してください。ユニークなものが必要です。私は要素への参照を使用することに決めました。 –

関連する問題