在c#中的当前标记周围添加XML标记

时间:2016-05-20 10:31:13

标签: c# xml ssis

我对XML相当陌生,在尝试通过SSIS加载一系列XML文件的过程中,我遇到了' null'将数据写入SQL表时的值问题。

XML是由第三方供应商提供的,它不能在最后进行更改 - 它就是它的大部分工作正常 - 只有一点文档可以返回这个& #39;空'价值问题。

我已经阅读了一些文章,发现这需要包含在另一个根节点Link

中的XML

所以我的问题是如何在一些当前标签周围添加标签? (拍下我糟糕的措辞)。

XML看起来像这样:

<Parent>

     <info>
       <id>1234</id>
       <secondary_id>ABC-1234</secondary_id>
     </info>

       <Child>Something</child>
       <child2>Something else</child2>
       <child3>Something else here</child3>

     <Summary>
       <text>1234</text>
     </Summary>

</Parent>

我需要做的是在上面的子标签周围动态添加标签,以获得类似的结果:

     <info>
       <id>1234</id>
       <secondary_id>ABC-1234</secondary_id>
     </info>

     <info_2>
       <Child>Something</child>
       <child2>Something else</child2>
       <child3>Something else here</child3>
     </info_2>

     <Summary>
       <text>1234</text>
     </Summary>

</Parent>

SSIS使用foreach循环遍历所有XML文件。我在这个阶段的理论是添加一个脚本任务,获取当前文件变量并使用它来加载和编辑XML,然后在数据流任务选择它之前保存它并提取数据。

enter image description here

我已经手动将一些标签添加到一个文件中,它确实消除了空值问题 - 所以我确信它会起作用。

我的脚本任务中的当前代码是:

public void Main()
        {
            //Get the variable from the foreach which contains the current file name.

            string filename = Convert.ToString(Dts.Variables["User::File_Name"]);

            //Create a new XML document object and then load the current file into it.

            XmlDocument doc = new XmlDocument();
            doc.Load(filename);
}

但后来我不知道如何添加这些标签!

2 个答案:

答案 0 :(得分:1)

  1. 查找名称以&#39; child&#39;
  2. 开头的元素
  3. 创建新的父元素info_2,其中填充了找到的元素的副本作为其内容
  4. 从树中删除步骤1中找到的原始元素
  5. 以下是一个例子:

    var raw = @"<Parent>
         <info>
           <id>1234</id>
           <secondary_id>ABC-1234</secondary_id>
         </info>
    
           <child>Something</child>
           <child2>Something else</child2>
           <child3>Something else here</child3>
    
         <Summary>
           <text>1234</text>
         </Summary>
    </Parent>";
    var doc = XDocument.Parse(raw);
    
    //step 1
    var elements = doc.Root.Elements().Where(o => o.Name.LocalName.StartsWith("child"));
    
    //step 2
    var newElement = new XElement("info_2", elements);
    doc.Root.Element("info").AddAfterSelf(newElement);
    
    //step 3:
    elements.Remove();
    
    //print result
    Console.WriteLine(doc.ToString());
    

    输出:

    <Parent>
      <info>
        <id>1234</id>
        <secondary_id>ABC-1234</secondary_id>
      </info>
      <info_2>
        <child>Something</child>
        <child2>Something else</child2>
        <child3>Something else here</child3>
      </info_2>
      <Summary>
        <text>1234</text>
      </Summary>
    </Parent>
    

答案 1 :(得分:0)

来自har07的伟大解决方案。

我已经编辑了名字,但这里是解决我问题的代码:

    public void Main()
            {

                string filename = Convert.ToString(Dts.Variables["User::File_Name"].Value);

                XDocument xml = new XDocument();

                var doc = XDocument.Load(filename);

                var element1 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("bob"));
                var element2 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("mice"));
                var element3 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("car"));
                var element4 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("dog"));
                var element5 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("cat"));
                var element6 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("number"));
                var element7 = doc.Root.Elements().Where(o => o.Name.LocalName.Equals("thing"));

                var newElement = new XElement("New_Tag", element1, element2, element3, element4, element5, element6, element7);
                doc.Root.Element("Some_Tag").AddBeforeSelf(newElement);

                element1.Remove();
                element2.Remove();
                element3.Remove();
                element4.Remove();
                element5.Remove();
                element6.Remove();
                element7.Remove();

                doc.Save(filename);

                Dts.TaskResult = (int)ScriptResults.Success;
            }