Linq to XML - исключение нулевой ссылки при использовании linq query.n - PullRequest
3 голосов
/ 25 августа 2009

У меня есть простой XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<ConvenioValidacao>
    <convenio ven_codigo="1" tipoValidacao="CPF"></convenio>
    <convenio ven_codigo="1" tipoValidacao="MATRICULA"></convenio>
    <convenio ven_codigo="3" tipoValidacao="CPF"></convenio>
    <convenio ven_codigo="4" tipoValidacao="CPF"></convenio>
</ConvenioValidacao>

Я пытаюсь выполнить простой запрос к этому XML-файлу, используя Linq to XML , вот что я делаю:

var myXmlDoc = XElement.Load(filePath);
var result =  from convenio in myXmlDoc.Element("ConvenioValidacao").Elements("convenio")
                 where (string)convenio.Attribute("ven_codigo") == "1" &&
                 (string)convenio.Attribute("tipoValidacao") == "CPF"
                 select convenio;

Это не работает, я получаю исключение нулевой ссылки.

Что я делаю не так?

Ответы [ 3 ]

9 голосов
/ 25 августа 2009

Используйте это вместо:

var result = from convenio in myXmlDoc.Elements("convenio")
                 where (string)convenio.Attribute("ven_codigo") == "1" &&
                 (string)convenio.Attribute("tipoValidacao") == "CPF"
                 select convenio;

Поскольку myXmlDoc относится к типу XElement, «элемент документа» отсутствует, и поэтому корнем элемента является корневой узел (<ConveioValidacao>). Поскольку это корневой узел, вам не нужно указывать его в методе Elements, поскольку это текущая позиция в документе.

В качестве примечания я рекомендую переименовать myXmlDoc в myXmlElement, чтобы избежать путаницы.

1 голос
/ 25 августа 2009

.Element метод получает первый дочерний элемент данного элемента, здесь ConveioValidacao не является дочерним элементом, это родительский элемент, при загрузке методом XEelemnt.Load () он получает ConveioValidacao и его дочерние элементы, поэтому следует использовать код Эндрю.

0 голосов
/ 25 августа 2009

Попробуйте потомков вместо элементов

var result =  from convenio in myXmlDoc.Descendants("ConveioValidacao").Descendants("convenio")
                 where (string)convenio.Attribute("ven_codigo") == "1" &&
                 (string)convenio.Attribute("tipoValidacao") == "CPF"
                 select convenio;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...