Aktuelle Zeilennummer von einem System.Xml.XmlReader (C # & .Net)
-
05-07-2019 - |
Frage
Wer weiß, wie ich die aktuelle Zeilennummer eines System.Xml.XmlReader bekommen kann? Ich versuche, wo in einer Datei aufzeichnen I XML-Elemente zu finden.
Lösung
Nutzen Sie die IXmlLineInfo
Schnittstelle unterstützt durch ein XmlReader
:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
Andere Tipps
Aufbauend auf der IXmlLineInfo
Schnittstelle ist die Dokumentation für diese ziemlich schlecht; ein bisschen graben zu tun, kann ich Ihnen folgende sagen:
1) System.Xml.XmlReader
ist abstrakt, so dass Sie nie mit einem Beispiel dafür zu tun gehen werden, als solche, die Tatsache, dass es nicht IXmlLineInfo
nicht implementiert ist nicht massiv über (obwohl, wenn es so wäre, wäre es machen alles nur ein bisschen einfacher :))
2) Die System.Xml.IXmlLineInfo
Schnittstelle bietet zwei Eigenschaften: LineNumber
und LinePosition
(was die Dinge sind, wir kümmern uns um), sowie ein Verfahren. HasLineInfo()
, die nach der Dokumentation, werden Sie wissen lassen, wenn ein Implementierer die lineinfo zurückkehren
3) Von den dokumentierten Erben System.Xml.XmlReader
, die wir haben:
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.
in der obigen Liste der Suche wird die XmlDictionaryReader
geht intern verwendet werden soll, wird der XmlNodeReader
verwendet zu gehen, wenn Sie in einem Knoten weitergeleitet habe gelesen werden (die analysiert wurde, ist bereits untethered von seinem Quelldokument ), die XmlTextReader
und XmlValidtingReader
(von denen beide implementieren IXmlLineInfo
), werden verwendet werden, wenn Sie aus einem Dokument gerade lesen. So scheint die lange und die kurze davon zu sein, dass, wenn es möglich oder sinnvoll ist, um Sie Informationen zu positionieren zu geben, tut das Gerüst so.
Dass gesagt wird, scheint die Dokumentation sehr leicht zu sein. Nachdem dies nur getan, landete ich tun (mit _xr eine unbekannte konkrete Umsetzung System.Xml.XmlReader
ist):
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() + ")";
}
Mit all diesem wird gesagt, wenn ich tatsächlich den Code oben ausgeführt, die Art der _xr endet System.Xml.XsdValidatingReader
sein (viel Glück zu finden Dokumentation auf das!), Die von System.Xml.XmlReader
erbt, aber nicht erben nicht von System.Xml.XmlValidatingReader
oder System.Xml.XmlTextReader
. Als solches ist es wahrscheinlich sinnvoll, einen Ansatz, wie das oben zu verwenden.