如何在 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>
我有一个 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>