Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加或更新XML节点_C#_Xml_Tableau Api - Fatal编程技术网

C# 添加或更新XML节点

C# 添加或更新XML节点,c#,xml,tableau-api,C#,Xml,Tableau Api,我需要添加一对子节点,或者更新已经存在的节点。正如您可以从下面的小示例中看到的,我有一个节点带有子节点,另一个没有子节点。假设我有一个来自SQL表的这两个的定义,我想将值添加到节点 XML 您可以使用以下逻辑: var document = XDocument.Load(path); var elements = (from column in document.Descendants("column") select new {

我需要添加一对子节点,或者更新已经存在的节点。正如您可以从下面的小示例中看到的,我有一个节点带有子节点,另一个没有子节点。假设我有一个来自SQL表的这两个的定义,我想将值添加到节点

XML


您可以使用以下逻辑:

var document = XDocument.Load(path);
var elements = (from column in document.Descendants("column")
               select new
               {
                    AttributeName = column.Attribute("name").Value,
                    Parent = column,
                    Run = column.Descendants("run").FirstOrDefault()
               }).ToList();

foreach(var item in elements)
{
     XElement run;
     if (item.Run == null)
     {
          run = new XElement("run");
          item.Parent.Add(
              new XElement("desc", 
                  new XElement("formatted-text", 
                      run
                  )
              )
          );
      }
      else
      {
           run = item.Run;
      }

      if(item.AttributeName == "BlaBlaOne")
      {
           run.Value = "Your definition here";
      }
 }

 document.Save(path);

您可以使用以下逻辑:

var document = XDocument.Load(path);
var elements = (from column in document.Descendants("column")
               select new
               {
                    AttributeName = column.Attribute("name").Value,
                    Parent = column,
                    Run = column.Descendants("run").FirstOrDefault()
               }).ToList();

foreach(var item in elements)
{
     XElement run;
     if (item.Run == null)
     {
          run = new XElement("run");
          item.Parent.Add(
              new XElement("desc", 
                  new XElement("formatted-text", 
                      run
                  )
              )
          );
      }
      else
      {
           run = item.Run;
      }

      if(item.AttributeName == "BlaBlaOne")
      {
           run.Value = "Your definition here";
      }
 }

 document.Save(path);


你想更新什么?属性还是整个节点?@CodeNotFound基于name属性,我想查询该名称的值表,然后使用表中的定义添加desc子节点。定义将位于属性名中是否可能有多个具有相同值的列元素?@CodeNotFound我不相信有多个相同的属性名。我有一个方法可以查询我的表,您只需将nodes值添加到参数中,它将以字符串形式返回关联的定义。您希望更新什么?属性还是整个节点?@CodeNotFound基于name属性,我想查询该名称的值表,然后使用表中的定义添加desc子节点。定义将位于属性名中是否可能有多个具有相同值的列元素?@CodeNotFound我不相信有多个相同的属性名。我有一个方法可以查询我的表,您只需要将nodes值添加到参数中,它就会以字符串的形式返回关联的定义。很好,这非常简单,但我无法理解语法。标记为answer。它正在更新Run节点,但我无法让它在Column节点下添加一个。是不是因为我们没有完整的节点堆栈?我在顶部添加了新的信息,这些信息适合您编写的代码。看起来If中的item.Parent.Add不起作用。我没有在.Item之后选择Parent。我在想也许item.Run.AddBeforeSelf?想法?我在linq查询中添加了父属性。确保您在选择查询中添加了它。很好,这非常简单,但我无法理解语法。标记为answer。它正在更新Run节点,但我无法让它在Column节点下添加一个。是不是因为我们没有完整的节点堆栈?我在顶部添加了新的信息,这些信息适合您编写的代码。看起来If中的item.Parent.Add不起作用。我没有在.Item之后选择Parent。我在想也许item.Run.AddBeforeSelf?想法?我在linq查询中添加了父属性。确保已将其添加到选择查询中。
var document = XDocument.Load(path);
            var elements = (from column in document.Descendants("column")
                            select new
                                {
                                    AttributeName = column.Attribute("name").Value,
                                    Run = column.Descendants("run").FirstOrDefault() ?? new XElement("run")
                                }).ToList();

            foreach (var item in elements)
            {
                if (item.Run == null) continue;
                else 
                {
                    item.Run.Value = GetVariable(item.AttributeName);
                                     // Getvariable is the method that returns the definition
                }
            }

            document.Save(path);
var document = XDocument.Load(path);
var elements = (from column in document.Descendants("column")
               select new
               {
                    AttributeName = column.Attribute("name").Value,
                    Parent = column,
                    Run = column.Descendants("run").FirstOrDefault()
               }).ToList();

foreach(var item in elements)
{
     XElement run;
     if (item.Run == null)
     {
          run = new XElement("run");
          item.Parent.Add(
              new XElement("desc", 
                  new XElement("formatted-text", 
                      run
                  )
              )
          );
      }
      else
      {
           run = item.Run;
      }

      if(item.AttributeName == "BlaBlaOne")
      {
           run.Value = "Your definition here";
      }
 }

 document.Save(path);