Numero di riga corrente da un System.Xml.XmlReader (C # & amp; .Net)
-
05-07-2019 - |
Domanda
Qualcuno sa come posso ottenere il numero di riga corrente di un System.Xml.XmlReader? Sto cercando di registrare dove in un file trovo elementi Xml.
Soluzione
Approfitta del IXmlLineInfo
interfaccia supportata da un XmlReader
:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
Altri suggerimenti
Espandendosi sull'interfaccia IXmlLineInfo
, la documentazione per questo è piuttosto negativa; dal fare un po 'di scavo, posso dirti quanto segue:
1) System.Xml.XmlReader
è astratto, quindi non avrai mai a che fare con un'istanza di questo, come tale, il fatto che non implementa IXmlLineInfo
non riguarda in modo massiccio (anche se, in tal caso, renderebbe tutto più semplice :))
2) L'interfaccia System.Xml.IXmlLineInfo
fornisce due proprietà: LineNumber
e LinePosition
(che sono le cose a cui teniamo), più un metodo: HasLineInfo ()
che, secondo la documentazione, ti farà sapere se un implementatore può restituire il lineinfo.
3) Tra gli eredi documentati di System.Xml.XmlReader
, abbiamo:
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.
Guardando l'elenco sopra, XmlDictionaryReader
verrà utilizzato internamente, XmlNodeReader
verrà utilizzato quando si passa in un nodo da leggere (che, dopo essere stato analizzato, è già libero dal suo documento di origine), XmlTextReader
e XmlValidtingReader
(entrambi i quali implementano IXmlLineInfo
), sono verrà utilizzato quando stai leggendo da un documento. Quindi, in sostanza, sembra che se è possibile o utile fornire informazioni sulla posizione, il framework lo farà.
Detto questo, la documentazione sembra essere molto leggera. Dopo averlo fatto, ho finito per farlo (con _xr un'implementazione concreta sconosciuta di 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() + ")";
}
Detto questo, quando eseguo effettivamente il codice sopra, il tipo di _xr finisce per essere System.Xml.XsdValidatingReader
(buona fortuna nel trovare la documentazione su questo!), che eredita da System.Xml.XmlReader
, ma non eredita da System.Xml.XmlValidatingReader
o System.Xml.XmlTextReader
. Pertanto, è probabilmente saggio utilizzare un approccio come sopra.