首页 > 解决方案 > LINQ XML - 在 Null 异常中添加元素

问题描述

当我执行下面的代码时,为了在 XML 文件中添加一个元素,我检索了一个“System.NullReferenceException”,详细说明:“System.Xml.Linq.XContainer.Element(...) return null”。我无法解释为什么。该文件存在以及其中的元素。

我使用以下代码:

 XDocument COCOPrivsSession = XDocument.Load(Path.GetFullPath(Properties.Settings.Default.pathData) + "currentSession_" + System.DateTime.Now.ToString("ddMMyyyy") + ".xml");
                   
                    COCOPrivsSession.Element("PRIVSEVENTS").Element("Priv_" + PrivNumber.ToString()).Add(
                       new XElement("Session_" + (COCOPrivsSession.Elements("Priv_" + PrivNumber).Count() + 1).ToString(), 
                            new XElement("hostName", cbHOSTSelector.Text.ToString()),
                            new XElement("startTime", System.DateTime.Now.ToString("dd/MM/yyyy-HH:mm:ss")),
                            new XElement("dedicatedTime_seconds", Program.MainFRMHome.TimeLeft_Priv[PrivNumber].ToString()),
                            new XElement("calculatedEndTime", System.DateTime.Now.AddSeconds(Program.MainFRMHome.TimeLeft_Priv[PrivNumber]).ToString("dd/MM/yyyy-HH:mm:ss"))
                    )
                       );

                    COCOPrivsSession.Save(Path.GetFullPath(Properties.Settings.Default.pathData) + "currentSession_" + System.DateTime.Now.ToString("ddMMyyyy") + ".xml");

这是 XML 根

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--SESSIONE CORRENTE-->
<CURRENTSESSION>
  <SESSION_INFO>
    <Origin>
      <siteVersion>1.9</siteVersion>
      <siteName>COCOTimer</siteName>
      <xmlVersion>0.2</xmlVersion>
    </Origin>
    <currentSession>
      <startDate />09/02/2021 18:11:48</currentSession>
  </SESSION_INFO>
  <PRIVSEVENTS>
    <Priv_1 />
    <Priv_2 />
    <Priv_3 />
    <Priv_4 />
    <Priv_5 />
    <Priv_6 />
    <Priv_7 />
    <Priv_8 />
    <Priv_9 />
    <Priv_10 />
    <Priv_11 />
    <Priv_12 />
    <Priv_13 />
    <Priv_14 />
    <Priv_15 />
  </PRIVSEVENTS>
</CURRENTSESSION>

有没有人遇到相同或类似的问题并解决了?

编辑:jdweng 的回答解决了我的问题。

标签: c#xmllinqnull

解决方案


以下是经过测试的作品:

           XDocument COCOPrivsSession = XDocument.Load(FILENAME);
            string PrivNumber = "1";
            string host = "host";
            string timeLeft = "1234";
            int seconds = 10;

            XElement PRIVSEVENTS = COCOPrivsSession.Descendants("PRIVSEVENTS").FirstOrDefault();
                
            PRIVSEVENTS.Add(
                 new XElement("Session_" + (COCOPrivsSession.Elements("Priv_" + PrivNumber).Count() + 1).ToString(),
                 new XElement("hostName", host),
                 new XElement("startTime", System.DateTime.Now.ToString("dd/MM/yyyy-HH:mm:ss")),
                 new XElement("dedicatedTime_seconds", timeLeft),
                 new XElement("calculatedEndTime", System.DateTime.Now.AddSeconds(seconds).ToString("dd/MM/yyyy-HH:mm:ss"))
                 )
            );

推荐阅读