número de linha de corrente a partir de um System.Xml.XmlReader (C # & Net)
-
05-07-2019 - |
Pergunta
Alguém sabe como posso obter o número da linha atual de um System.Xml.XmlReader? Estou tentando gravar onde em um arquivo que eu encontrar elementos XML.
Solução
Aproveite a IXmlLineInfo
interface suportada por um XmlReader
:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
Outras dicas
Expandindo a interface IXmlLineInfo
, a documentação para isso é muito ruim; de fazer um pouco de escavação, posso dizer-lhe o seguinte:
1) System.Xml.XmlReader
é abstrata, então você nunca vai estar lidando com uma instância desta, como tal, o fato de que ele não implementa IXmlLineInfo
não é maciçamente a respeito (embora, se isso acontecesse, seria faça tudo que apenas pouco mais fácil :))
2) A interface System.Xml.IXmlLineInfo
fornece duas propriedades: LineNumber
e LinePosition
(que são as coisas que preocupam), além de um método:. HasLineInfo()
que, de acordo com a documentação, vai deixar você saber se um implementador pode retornar o lineinfo
3) Dos herdeiros documentados de System.Xml.XmlReader
, temos:
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.
Olhando para a lista acima, o XmlDictionaryReader
vai ser usado internamente, a XmlNodeReader
vai ser usado quando você passou em um nó a ser lido (que, tendo sido analisado, já é untethered do seu documento de origem ), o XmlTextReader
e XmlValidtingReader
(ambos implementar IXmlLineInfo
), vão ser usados ??quando você estiver lendo a partir de um documento. Assim, a longo ea curto do que parece ser que, se é possível ou útil para lhe dar informações sobre a posição, o quadro vai fazê-lo.
Dito isto, a documentação parece ser muito leve. Tendo acabado de fazer isso, eu acabei fazendo (com _xr ser uma implementação concreta desconhecida de 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() + ")";
}
Com tudo isso dito, quando eu realmente executar o código acima, o tipo de _xr acaba sendo System.Xml.XsdValidatingReader
(boa sorte encontrar documentação sobre isso!), Que herda de System.Xml.XmlReader
, mas não herda de System.Xml.XmlValidatingReader
ou System.Xml.XmlTextReader
. Como tal, é provavelmente sábio usar uma abordagem como o acima.