LINQ 通过循环访问现有 XML 文件来创建新的 Xdocument
本文关键字:文件 创建 Xdocument XML 循环 访问 LINQ | 更新日期: 2023-09-27 18:35:56
我是 LINQ 的新手,所以请耐心等待:)
我目前正在尝试将XML格式的SSIS包(.dtsx)逆向工程为.BIML文件,也是基于XML的。但是,它们对相同的对象具有不同的构造。
所以我要做的是遍历 .dtsx 包的 XML,并基本上检查元素的类型并在新文件中创建一个等效的元素,但名称/属性不同,但是我需要在新文件中创建元素时保持对象的层次结构关系。
但是我真的很纠结如何在循环访问源文件时向新文件添加新元素。
有人能够提供一些指示吗?
我目前能够遍历文件(我现在只是输出到控制台窗口以检查我是否在直接循环),但我正在努力将元素添加到新文件中
任何帮助非常感谢
string file = @"F:''sample.dtsx"
XDocument xDoc = XDocument.Load(file);
XNamespace env = "www.microsoft.com/SqlServer/Dts";
IEnumerable<XElement> elements = xDoc.Root.Descendants(); //
XDocument BIMLXdoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("Root"));
//BIMLXdoc.Add(new XElement("test")); ####This doesn't work
foreach (XElement element in elements)
{
// Test element and if of the correct type add new elemnt to biml file
IEnumerable<XAttribute> attribs = element.Attributes();
foreach (XAttribute attrib in attribs)
{
Console.WriteLine(element.Name.LocalName + " - Attribute(" + attrib.Name.LocalName + ") - Value:(" + attrib.Value + ")");
}
}
BIMLXdoc.Save("F:''BIMLTest.xml");
在注释行中,您正在尝试将节点添加到顶层。正确的 XML 文档只有一个根元素。因此,将您的节点添加到Root
元素:
var BIMLXdoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("Root"));
BIMLXdoc.Root.Add(new XElement("test")); // This works
如果要将新元素添加到Xdoc,则需要将其添加到特定位置:
改变:
BIMLXdoc.Add(new XElement("test"));
自:
BIMLXdoc.Element("Root").Add(new XElement("TestChild", "TestChildValue"));
您将拥有一个子元素。