C# 查询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文件,格式如下

<?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");