XElement.Elements()返回空集合

本文关键字:空集 集合 返回 Elements XElement | 更新日期: 2023-09-27 17:58:36

我正试图从数据库通知中接收的XElement中获取值。xml结构如下:

<?xml version="1.0"?>
<root>
    <inserted>
        <row>
            <CODI_AVERIA>22</CODI_AVERIA>
            <NUMERO_LINIA>2</NUMERO_LINIA>
            <DIA>2016-07-17T00:00:00</DIA>
            <HORA>1899-12-30T10:26:15.790</HORA>
            <CODI_USUARI>1</CODI_USUARI>
            <ACCIO>0</ACCIO>
            <CODI_PSEUDO>-1</CODI_PSEUDO>
        </row>
    </inserted>
</root>

这是我用来获取数据的方法,它会返回一个空的List。

static void getAccio(XElement xml)
{
    try
    {
        xml.Descendants("deleted").Remove();
        var items = xml.Elements("row").Select(n => new
        {
            Codi_averia = n.Element("CODI_AVERIA").Value,
            Numero_linia = n.Element("NUMERO_LINIA)").Value,
            Accio = n.Element("ACCIO").Value
        }).ToList();
    }
    catch (Exception e)
    {
        Console.Write(e.Message);
    }
}

我试图将每个字段的值分开,但这不允许我将它们单独作为XElements。

XElement.Elements()返回空集合

使用.Descendants()而不是.Elements():

var items = xml.Descendants("row").Select(n => new
    {
        Codi_averia = n.Element("CODI_AVERIA").Value,
        Numero_linia = n.Element("NUMERO_LINIA)").Value,
        Accio = n.Element("ACCIO").Value
    }).ToList();

.Elements只查找那些直接派生的元素,即直接子元素。-我假设您的XElementinserted部分的父级。

关于.Element.Descendants之间的差异,请参阅此问题

如果您不想在所有内部元素中也找到它们,请执行.Element("inserted").Elements("rows")

您的文档没有任何名为row的根元素。相反,您需要首先选择inserted,并枚举inserted:的row元素

var xml = @"<inserted>  
    <row>    
        <CODI_AVERIA>21</CODI_AVERIA>    
        <NUMERO_LINIA>2</NUMERO_LINIA>    
        <DIA>2016-07-17T00:00:00</DIA>    
        <HORA>1899-12-30T10:26:15.790</HORA>    
        <CODI_USUARI>1</CODI_USUARI>    
        <ACCIO>0</ACCIO>    
        <CODI_PSEUDO>-1</CODI_PSEUDO>  
    </row>
</inserted>";
var xdoc = XDocument.Parse(xml);
var items = xdoc.Element("inserted").Elements("row").Select(n => new
{
    Codi_averia = n.Element("CODI_AVERIA").Value,
    Numero_linia = n.Element("NUMERO_LINIA").Value,
    Accio = n.Element("ACCIO").Value
}).ToList();

在您的示例代码中,由于添加了引号和括号,("NUMERO_LINIA)")是错误的。

这对我有效:

XDocument xd = XDocument.Load("XMLFile1.xml");
var lst = (from n in xd.Descendants("row")
           select new
           {
                 Codi_averia = n.Element("CODI_AVERIA").Value,
                 Numero_linia = n.Element("NUMERO_LINIA").Value,
                 Accio = n.Element("ACCIO").Value
           }).ToList();
foreach (var item in lst)
     Console.WriteLine(string.Format("{0}{1}{2}", item.Codi_averia, item.Numero_linia, item.Accio));