1

我对 LINQ 很陌生,所以请多多包涵:)

我目前正在尝试将 XML 格式的 SSIS 包 (.dtsx) 反向工程为同样基于 XML 的 .BIML 文件。但是,对于相同的对象,它们具有不同的构造。

所以我想要做的是遍历 .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");
4

2 回答 2

0

在注释行中,您尝试将节点添加到顶层。正确的 XML 文档只有一个根元素。因此,将节点添加到Root元素:

    var BIMLXdoc = new XDocument(
            new XDeclaration("1.0", "utf-8", null),
            new XElement("Root"));
    BIMLXdoc.Root.Add(new XElement("test"));  // This works
于 2013-10-18T23:25:26.133 回答
0

如果要向 Xdoc 添加新元素,则需要将其添加到特定位置:

改变:

BIMLXdoc.Add(new XElement("test"));

至:

BIMLXdoc.Element("Root").Add(new XElement("TestChild", "TestChildValue"));

你将有一个子元素。

于 2013-10-18T23:25:38.700 回答