System.Xml.XmlReaderの現在の行番号(C#& .Net)
-
05-07-2019 - |
質問
System.Xml.XmlReaderの現在の行番号を取得する方法を知っている人はいますか?ファイル内のXml要素の場所を記録しようとしています。
解決
IXmlLineInfo
を活用する XmlReader
でサポートされるインターフェース:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
他のヒント
IXmlLineInfo
インターフェースを拡張すると、このドキュメントはかなり悪いものになります。少し掘り下げることで、次のことがわかります。
1) System.Xml.XmlReader
は抽象であるため、このインスタンスを処理することは決してありません。したがって、 IXmlLineInfoを実装していないという事実
はそれほど重要ではありません(ただし、そうすることで、すべてが少し簡単になります:))
2) System.Xml.IXmlLineInfo
インターフェースは2つのプロパティを提供します: LineNumber
および LinePosition
(これらは重要なことです)、さらに、メソッド: HasLineInfo()
は、ドキュメントによると、実装者がlineinfoを返すことができるかどうかを知らせます。
3) System.Xml.XmlReader
の文書化された継承者のうち、次のものがあります。
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
は読み取られるノードを渡したときに使用されます(解析済みで、ソースドキュメントから既に解放されています)、 XmlTextReader
および XmlValidtingReader
(どちらも IXmlLineInfo
を実装)ドキュメントから読んでいるときに使用されます。したがって、長短は、位置情報を提供することが可能または有用な場合、フレームワークがそうするということです。
そうは言っても、ドキュメントは非常に軽いようです。これを実行した直後に、(
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.XsdValidatingReader
になります(幸運なことにドキュメントを見つけること!)。 System.Xml.XmlReader
、ただし System.Xml.XmlValidatingReader
または System.Xml.XmlTextReader
からは継承しません。そのため、上記のようなアプローチを使用することはおそらく賢明です。