如何在 XML 文件中的特定位置添加新节点 C#

How to add new nodes in XML file in specific positions C#

我有一个 XML 文件:

    <resteraunts xmlns="http://w3.com">
  <resteraunt>
    <name>Little Italy Food</name>
  </resteraunt>
  <resteraunt>
    <name>Mark's Salads</name>
  </resteraunt>
  <resteraunt>
    <name>Greek Meals</name>
  </resteraunt>
</resteraunts>

我正在尝试为标签下的每家餐厅添加一个 ID,因此它看起来像这样:

    <resteraunts xmlns="http://w3.com">
  <resteraunt>
    <Id>1</Id>
    <name>Little Italy Food</name>
  </resteraunt>
  <resteraunt>
    <Id>2</Id>
    <name>Mark's Salads</name>
  </resteraunt>
  <resteraunt>
    <Id>3</Id>
    <name>Greek Meals</name>
  </resteraunt>
</resteraunts>

我试过使用追加,它只会将它们添加到 XML 文件的底部。我也试过这个,但我收到一个错误,它是空的。

       XmlDocument doc = new XmlDocument();
        XmlNode root = doc.DocumentElement;

        //Create a new node.
        XmlElement elem = doc.CreateElement("Id");
        elem.InnerText = myCounter.ToString();

        //Add the node to the document.
        root.InsertAfter(elem, root.FirstChild);

根据 documentation,您应该能够通过将 refChild 作为 null 传递到子节点列表的开头来插入新节点。

//Add newNode as the first child of root.
root.InsertAfter(newNode, null);

使用 LINQ 到 XML

var document = XDocument.Load("path-to-file");

var restaurants = document.Descendants("resteraunt")
    .Select((e, i) => (Id: id, Element: e));
foreach (var e in restaurants)
{
    e.Element.Add("Id", e.Id);
}

document.Save("path-to-file");

问题是您需要能够处理命名空间。

const string ns = "http://w3.com";
var doc = new XmlDocument();
var nsManager = new XmlNamespaceManager(doc.NameTable);
doc.Load("myXmlFile.xml");
nsManager.AddNamespace("n", ns);
var restaurants = doc.SelectNodes("/n:resteraunts/n:resteraunt", nsManager);
int myCounter = 1;
foreach (XmlNode restaurant in restaurants)
{
    var name = restaurant.SelectSingleNode("./n:name", nsManager);
    var id = doc.CreateElement("Id", ns);
    id.InnerText = myCounter.ToString();

    restaurant.InsertBefore(id, name);
    myCounter++;
}

doc.Save("myNewFile.xml");

这会生成:

<resteraunts xmlns="http://w3.com">
  <resteraunt>
    <Id>1</Id>
    <name>Little Italy Food</name>
  </resteraunt>
  <resteraunt>
    <Id>2</Id>
    <name>Mark's Salads</name>
  </resteraunt>
  <resteraunt>
    <Id>3</Id>
    <name>Greek Meals</name>
  </resteraunt>
</resteraunts>