Как удалить node из файла XML с помощью С#
Возможный дубликат:
Как удалить XmlNode из XmlNodeList
Привет, Как я могу удалить набор узлов из XML файла.?
Вот фрагмент кода.
string path = @"C:\Documents and Settings\e454935\Desktop\NUnitSettings.xml";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
xmldoc.Load(fs);
fs.Close();
xmldoc.DocumentElement.RemoveChild(xmldoc.DocumentElement.ChildNodes[1]);
FileStream WRITER = new FileStream(path, FileMode.Truncate, FileAccess.Write, FileShare.ReadWrite);
xmldoc.Save(WRITER);
WRITER.Close();
Я попробовал следующий код просто удалить node и получил
"В экземпляре объекта не задана ссылка на объект." при
xmldoc.DocumentElement.RemoveChild(xmldoc.DocumentElement.ChildNodes[1]);
Вот пример XML файла,
<?xml version="1.0"?>
<Xml1>
<Settings>
<Setting name="DisplayFormat" value="Full" />
<Setting name="File1" value="a" />
<Setting name="File1" value="b" />
<Setting name="File1" value="c" />
<Setting name="File1" value="d" />
</Settings>
</Xml1>
Фактически из этого файла я хочу удалить узлы Four File1, которые имеют значения "a, b, c, d", а затем я хочу добавить node,
<Setting name="File1" value="e" />
Как я могу это сделать?
Ответы
Ответ 1
Может быть проще использовать XPath для поиска узлов, которые вы хотите удалить. fooobar.com/questions/212743/... может дать вам несколько идей.
В вашем случае вы найдете четыре узла, которые хотите использовать это выражение:
XmlDocument doc = new XmlDocument();
doc.Load(fileName);
XmlNodeList nodes = doc.SelectNodes("//Setting[@name='File1']");
Ответ 2
Вы можете использовать Linq to XML для этого:
XDocument doc = XDocument.Load("input.xml");
var q = from node in doc.Descendants("Setting")
let attr = node.Attribute("name")
where attr != null && attr.Value == "File1"
select node;
q.ToList().ForEach(x => x.Remove());
doc.Save("output.xml");
Ответ 3
Удаление узлов из XML
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNodeList nodes = doc.SelectNodes("//Setting[@name='File1']");
for (int i = nodes.Count - 1; i >= 0; i--)
{
nodes[i].ParentNode.RemoveChild(nodes[i]);
}
doc.Save(path);
Добавление атрибута к узлам в XML
XmlDocument originalXml = new XmlDocument();
originalXml.Load(path);
XmlNode menu = originalXml.SelectSingleNode("//Settings");
XmlNode newSub = originalXml.CreateNode(XmlNodeType.Element, "Setting", null);
XmlAttribute xa = originalXml.CreateAttribute("name");
xa.Value = "qwerty";
XmlAttribute xb = originalXml.CreateAttribute("value");
xb.Value = "555";
newSub.Attributes.Append(xa);
newSub.Attributes.Append(xb);
menu.AppendChild(newSub);
originalXml.Save(path);
Ответ 4
DocumentElement
- это корень node документа, поэтому childNodes[1]
не существует в этом документе. childNodes[0]
будет <Settings> node