C# 添加或更新XML节点
我需要添加一对子节点,或者更新已经存在的节点。正如您可以从下面的小示例中看到的,我有一个节点带有子节点,另一个没有子节点。假设我有一个来自SQL表的这两个的定义,我想将值添加到节点 XMLC# 添加或更新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 {
您可以使用以下逻辑:
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);