如何从XmlNodeList删除XmlNode

这段代码演示了如何使用XmlDocument类和XPath选择器来删除XML文件中的特定节点。首先加载XML文件,然后通过XPath查询选取要删除的节点,从父节点移除这些节点,最后保存修改后的文件。

https://www.codenong.com/875136/

XmlDocument doc = new XmlDocument();
doc.Load(fileName);
XmlNodeList nodes = doc.SelectNodes("some-xpath-query");
for (int i = nodes.Count - 1; i >= 0; i--)
{
    nodes[i].ParentNode.RemoveChild(nodes[i]);
}
doc.Save(fileName);

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xaml; using System.Xml; namespace LayoutXamlParsing { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); //显示选择文件对话框 openFileDialog1.InitialDirectory = "c:\\"; openFileDialog1.Filter = "xaml file (*.xaml)|*.xaml|All files (*.*)|*.*"; //所有的文件格式 openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { this.textBox1.Text = openFileDialog1.FileName; //显示文件路径 } } private void button2_Click(object sender, EventArgs e) { double canvasTop = 0.0; double canvasLeft = 0.0; String path = textBox1.Text; // path = "E:/SVNProject/code_repo/DigitalTwin/layouts/LayoutProject_Sess_ILine_2F_462/LayoutFolderV2/Layout_Sess_IL_2F_FRONT.xaml"; List<Eqp> eqpList = new List<Eqp>(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(path); //添加命名空间,这一步一定要有,否则读取不了 XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(xmlDoc.NameTable); xmlNamespaceManager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml"); xmlNamespaceManager.AddNamespace("d", "http://schemas.microsoft.com/expression/blend/2008"); xmlNamespaceManager.AddNamespace("IMonitoringClient_Controls", "http://schemas.openxmlformats.org/markup-compatibility/2006"); xmlNamespaceManager.AddNamespace("mc", "clr-namespace:IMonitoringClient.Controls;assembly=IMonitoringControls"); xmlNamespaceManager.AddNamespace("mc", "clr-namespace:IMonitoringClient.Controls;assembly=IMonitoringControls"); xmlNamespaceManager.AddNamespace("mc", "clr-namespace:IMonitoringClient.Controls;assembly=IMonitoringControls"); XmlNodeList xmlNodeList = xmlDoc.DocumentElement.ChildNodes; foreach (XmlNode childXmlNode in xmlNodeList) { //读取数据节点(sys:String) string childName = childXmlNode.Name; if (childName.Equals("IMonitoringClient_Controls:LayoutCanvasPanel")) { XmlNodeList IMonitorList = childXmlNode.ChildNodes; foreach (XmlNode child in IMonitorList) { String name = ""; try { name = child.Attributes["x:Name"].Value; } catch (Exception ex) { name = ""; } //String name = child.Attributes["x:Name"].Value; if (child.Name.Equals("Canvas") && name.Equals("DA")) { canvasTop = double.Parse(child.Attributes["Canvas.Top"].Value); canvasLeft = double.Parse(child.Attributes["Canvas.Left"].Value); XmlNodeList canvasList = child.ChildNodes; foreach (XmlNode canvas in canvasList) { if (canvas.Name.Equals("Canvas")) { double canvasTopI = canvasTop + double.Parse(canvas.Attributes["Canvas.Top"].Value); double canvasLeftI = canvasLeft + double.Parse(canvas.Attributes["Canvas.Left"].Value); XmlNodeList eqNodeList = canvas.ChildNodes; foreach (XmlNode eqp in eqNodeList) { string eqpID = eqp.Attributes["EQPID"].Value; if (eqpID.Contains("DA")) { double eqpTop = double.Parse(eqp.Attributes["Canvas.Top"].Value); double eqpLeft = double.Parse(eqp.Attributes["Canvas.Left"].Value); eqpList.Add(CreateEqp(eqpID, eqpTop + canvasTopI, eqpLeft + canvasLeftI)); } } }else if (canvas.Name.Equals("IMonitoringClient_Controls_UnitControlV2:ccEQPBoxType82")) { string eqpID = canvas.Attributes["EQPID"].Value; if (eqpID.Contains("DA")) { double eqpTop = double.Parse(canvas.Attributes["Canvas.Top"].Value); double eqpLeft = double.Parse(canvas.Attributes["Canvas.Left"].Value); eqpList.Add(CreateEqp(eqpID, eqpTop + canvasTop, eqpLeft + canvasLeft)); } } } if (eqpList.Count > 0) { double minLeft = eqpList.Min(eq => eq.left); double minTop = eqpList.Min(eq => eq.top); foreach (var eq in eqpList) { eq.left = eq.left - minLeft -60; eq.top = eq.top - minTop -60; } } outputCsv(eqpList); } } } ////读取属性值(testKey) //string childAttributesValue = childXmlNode.Attributes["x:Key"].Value; ////读取节点文本(testStringInnerText) //string childInnerText = childXmlNode.InnerText; ////读取子节点 //XmlNodeList childXmlNodeList = childXmlNode.ChildNodes; } } public void outputCsv(List<Eqp> eqpList) { // 导出为 CSV 文件 string csvFilePath = "E:/output.csv"; // 替换为你的 CSV 文件路径 StringBuilder csvContent = new StringBuilder(); // 添加表头 csvContent.AppendLine("eqpid,left,top"); // 添加数据行 foreach (var item in eqpList) { csvContent.AppendLine($"{item.eqp},{item.left},{item.top}"); } // 写入文件 File.WriteAllText(csvFilePath, csvContent.ToString()); Console.WriteLine($"数据已成功导出到 {csvFilePath}"); } public Eqp CreateEqp(String eqpID, double top, double left) { Eqp e = new Eqp(); e.eqp = eqpID; e.top = top / 10; e.left = left / 10; return e; } } }我的代码里面这句话为什么报错name = child.Attributes["x:Name"].Value;未将对象引用设置到对象的实例。
最新发布
10-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值