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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top