質問

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 を実装)ドキュメントから読んでいるときに使用されます。したがって、長短は、位置情報を提供することが可能または有用な場合、フレームワークがそうするということです。

そうは言っても、ドキュメントは非常に軽いようです。これを実行した直後に、( System.Xml.XmlReader の未知の具体的な実装である_xrを使用して)終了しました:

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 からは継承しません。そのため、上記のようなアプローチを使用することはおそらく賢明です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top