2009-03-07 45 views

答えて

35

XmlReaderでサポートされているIXmlLineInfoインタフェースを利用してください:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader; 
int lineNumber = xmlInfo.LineNumber; 
+2

悪い習慣のようです。 XmlReaderはIXmlLineInfoを継承しないため、この抽象クラスの実装はインターフェイスを実装しない可能性があります。インタフェースのサポートのチェックが必要です。 – SerG

+1

IXmlLineInfo xmlInfo = readerをIXmlLineInfoとして使用してください。この良いコードの練習。 @shuvra – Shuvra

1

IXmlLineInfoインターフェイスを拡張し、このためのドキュメントはかなり悪いです。

1)System.Xml.XmlReaderは抽象的なものなので、このインスタンスを扱うことは決してありません。そのため、実装されていないという事実LineNumberLinePosition(私たちは気にものです):System.Xml.IXmlLineInfoインタフェースは2つのプロパティを提供します)

2(それがなかったならば、それは:)すべてがちょうどその少し簡単になるだろう、が)IXmlLineInfoは、大規模に関してれていませんプラス方法:HasLineInfo()、ドキュメントに従って、インプリメンターがlineinfoを返すことができるかどうかを知らせます。 System.Xml.XmlReaderの文書化継ぐの

3)、我々は持っている:

System.Xml.XmlDictionaryReader - abstract, used by WCF for serialization, no IXmlLineInfo 
System.Xml.XmlNodeReader - used when reading a node, no IXmlLineInfo 
System.Xml.XmlTextReader - used when reading a stream of data, has IXmlLineInfo 
System.Xml.XmlValidatingReader - used when reading a stream of data and validating, has IXmlLineInfo. 

は、上記のリストを見ると、XmlDictionaryReaderは内部的に使用されようとしているあなたが合格したら、XmlNodeReaderが使用されようとしています(すでに解析されていて、元の文書からはまだ解かれている)ノード(IXmlLineInfoを実装しているXmlTextReaderXmlValidtingReader)は、ドキュメントを読み込んでいるときに使用されます。ですから、あなたの位置情報を与えることが可能であるか、または有用であれば、フレームワークはそうするでしょう。

言われているように、ドキュメントは非常に軽いと思われます。ただこれを行った、私は(_xrが未知の具体的なSystem.Xml.XmlReaderの実装された状態で)やってしまった:私は実際に上記のコードを実行すると、言われていることのすべてに

string position = "(unknown)"; 
    if (_xr != null && typeof(System.Xml.IXmlLineInfo).IsInstanceOfType(_xr) && 
((System.Xml.IXmlLineInfo)_xr).HasLineInfo()) 
    { 
     System.Xml.IXmlLineInfo li = (System.Xml.IXmlLineInfo)_xr; 
     position = "(" + li.LineNumber.ToString() + "," + li.LinePosition.ToString() + ")"; 
    } 

、_xrの種類がされて終わりますから継承しますが、System.Xml.XmlValidatingReaderまたはSystem.Xml.XmlTextReaderを継承しないSystem.Xml.XsdValidatingReader(それについての幸運な発見文書!)したがって、おそらく上記のようなアプローチを使用することが賢明でしょう。

関連する問題