简体   繁体   English

Linq to XML - 使用linq query.n时出现Null引用异常

[英]Linq to XML - Null Reference Exception when using linq query.n

I have a simple XML file: 我有一个简单的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>

I'm trying to do a simple query against this xml file using Linq to XML , here is what i'm doing: 我正在尝试使用Linq to XML对这个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;

It is not working, I'm getting null reference exception. 它不工作,我得到null引用异常。

What I'm doing wrong? 我做错了什么?

Use this instead: 请改用:

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

Since myXmlDoc is of type XElement there is no "document element" and as such the root of the element is the root node ( <ConveioValidacao> ). 由于myXmlDoc是类型XElement没有“文档元素”和作为元件的此类根根节点( <ConveioValidacao> Since this is the root node you don't need to specify it in an Elements method since that is current position in document. 由于这是根节点,因此您无需在Elements方法中指定它,因为它是文档中的当前位置。

As a side note, I recommend that you rename myXmlDoc to myXmlElement to reduce confusion. 作为旁注,我建议您将myXmlDoc重命名为myXmlElement以减少混淆。

.Element方法获取给定元素的第一个子元素,在这里ConveioValidacao不是子元素,它是父元素,当你通过XEelemnt.Load()方法加载时,它获取ConveioValidacao及其子元素,所以你应该使用Andrew的码。

Try Descendants instead of Elements 尝试Descendants而不是Elements

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM