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");

LINQ 通过循环访问现有 XML 文件来创建新的 Xdocument

在注释行中,您正在尝试将节点添加到顶层。正确的 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"));

您将拥有一个子元素。