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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top