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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top