C# 查询XML和更新某些元素
我有一个XML文件,格式如下C# 查询XML和更新某些元素,c#,xml,linq,xml-parsing,linq-to-xml,C#,Xml,Linq,Xml Parsing,Linq To Xml,我有一个XML文件,格式如下 <?xml version="1.0" ?> <AA someattrib="xyz"> <BB someOtherAttrib="xyz"> <Title></Title> <CC> <myNode rowid=""> <subNode1></subNode1>
<?xml version="1.0" ?>
<AA someattrib="xyz">
<BB someOtherAttrib="xyz">
<Title></Title>
<CC>
<myNode rowid="">
<subNode1></subNode1>
<subNode2></subNode2>
<nodeOfInterest></nodeOfInterest>
</myNode >
<myNode rowid="">
<subNode1> </subNode1>
</myNode>
</CC>
</BB>
</AA>
有没有一种方法可以通过在内存中使用列表和xmldoc之间的直接连接来实现这一点?这将是一个大列表和一个同样大的xml文件。我不认为运行循环并调用selectSingleNode是最有效的方法
感谢您的输入一个起点是创建一个
字典
将行ID映射到元素:
var dictionary = doc.Element("AA").Element("BB").Element("CC").Elements("myNode")
.ToDictionary(x => x.Attribute("rowId").Value);
然后:
就我个人而言,我更喜欢使用LINQ to XML提供的选择方法(
元素
,元素
,后代
等),而不是选择单节点
,选择子节点
等。在Jon回复的帮助下,完整答案
var doc = XDocument.Load("thefile.xml");
var dictionary = doc.Element("AA").Element("BB").Element("CC").Elements("myNode")
.ToDictionary(x => x.Attribute("rowId").Value);
foreach (User employee in Users)
{
XElement myNode;
if (dictionary.TryGetValue(employee.ID, out myNode))
{
XElement nodeOfInterest = myNode.Elements("nodeOfInterest").FirstOrDefault();
if (nodeOfInterest != null)
{
nodeOfInterest.Value = "update with this value";
}
else
{
XElement nodeOfInterest = new XElement("nodeOfInterest", "Add nodeOfInterest with this value");
myNode.Add(newElement);
}
}
}
doc.Save("TheFile.xml");
谢谢你的回答。我仍然无法更新[elementofInterest]节点或添加新节点,然后在更新/添加[elementofInterest]节点后将整个文档保存到文件系统中。您所说的“我仍然无法”是什么意思?尝试时会发生什么?如果我理解正确,If块将拥有整个[myNode]节点。在变量myNode中包含整个节点后,我仍然需要检查元素[elementofInterest]是否存在,如果存在,我需要更新它,如果不存在,我需要添加一个。这需要对循环中的迭代次数进行调整,然后需要修改文档saved@user20358:是的,这很容易做到-只需使用
myNode.Elements(“somename”)
获取相关的子级。例如,您可以使用Any()
检查是否有。我不会为您编写所有的代码,您的问题似乎是如何高效地找到myNode
元素,我已经回答了。也许我的问题框架不对。有三件事我需要帮助。查找、更新/添加、保存。我应该把它放在最后,而不是放在问题的for循环之前。谢谢你给我的提示。我将处理它。元素
从何而来它从未声明过元素应该是myNode,我相信
foreach (User employee in Users)
{
XElement myNode;
if (dictionary.TryGetValue(employee.ID, out myNode))
{
// Use myNode
}
else
{
// Employee not found
}
}
var doc = XDocument.Load("thefile.xml");
var dictionary = doc.Element("AA").Element("BB").Element("CC").Elements("myNode")
.ToDictionary(x => x.Attribute("rowId").Value);
foreach (User employee in Users)
{
XElement myNode;
if (dictionary.TryGetValue(employee.ID, out myNode))
{
XElement nodeOfInterest = myNode.Elements("nodeOfInterest").FirstOrDefault();
if (nodeOfInterest != null)
{
nodeOfInterest.Value = "update with this value";
}
else
{
XElement nodeOfInterest = new XElement("nodeOfInterest", "Add nodeOfInterest with this value");
myNode.Add(newElement);
}
}
}
doc.Save("TheFile.xml");