如何基于节点将XML文件拆分为多个XML文件
我有一个XML文件如下
WNL TextBox 500 txt1 WNL TextBox 500 txt2 0 ControlsID
我想将xml文件拆分为三个。 根据它的节点
档案1:
WNL TextBox 500 txt1
文件2:
WNL TextBox 500 txt2
档案3:
0 ControlsID
节点也是动态的,它们可能会改变。 如何根据节点将此xml文件拆分为多个。 如果有人知道请分享。
试试LinqToXml :
var xDoc = XDocument.Parse(Resource1.XMLFile1); // loading source xml var xmls = xDoc.Root.Elements().ToArray(); // split into elements for(int i = 0;i< xmls.Length;i++) { // write each element into different file using (var file = File.CreateText(string.Format("xml{0}.xml", i + 1))) { file.Write(xmls[i].ToString()); } }
它将获取根元素内定义的所有元素,并将其内容写入单独的文件中。
使用Linq到Xml它更简单 – 您可以使用XElement.Save方法将任何元素保存到单独的xml文件中:
XDocument xdoc = XDocument.Load(path_to_xml); int index = 0; foreach (var element in xdoc.Root.Elements()) element.Save(++index + ".xml");
或者一行
XDocument.Load(path_to_xml).Root.Elements() .Select((e, i) => new { Element = e, File = ++i + ".xml" }) .ToList().ForEach(x => x.Element.Save(x.File));
您可以使用XmlTextReader和XmlWriter类来完成您的任务。 但是您需要知道开始创建新XML文件的位置。 查看您的示例,您希望拆分根节点中包含的每个节点。
这意味着一旦你开始阅读XML文件, 你需要确保你在根节点内 ,然后你需要跟踪你的XML深度 ,这样你可以在到达下一个节点时关闭该文件。根节点。
请参阅此示例 – 我从file.xml读取XML并打开XML编写器。 当我到达根节点中包含的第一个节点时,我开始编写元素。
我记得变量“treeDepth”中的深度,它表示XML树结构深度。
基于当前读取的节点,我做了一个动作。 当我到达具有树深度1的End元素时 ,这意味着我再次位于根节点中,因此我关闭当前XML文件并打开新文件。
XmlTextReader reader = new XmlTextReader ("file.xml"); XmlWriter writer = XmlWriter.Create("first_file.xml") writer.WriteStartDocument(); int treeDepth = 0; while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // // Move to parsing or skip the root node // if (treeDepth > 0) writer.WriteStartElement(reader.Name); treeDepth++; break; case XmlNodeType.Text: // // Write text here // writer.WriteElementString (reader.Value); break; case XmlNodeType.EndElement: // // Close the end element, open new file // if (treeDepth == 1) { writer.WriteEndDocument(); writer = new XmlWriter("file2.xml"); writer.WriteStartDocument(); } treeDepth--; break; } } writer.WriteEndDocument();
请注意,此代码并不能完全解决您的问题,而只是解释了完全解决问题所需的逻辑。
有关XML阅读器和编写器的更多帮助,请阅读以下链接: