我对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,然后在数据流任务选择它之前保存它并提取数据。
我已经手动将一些标签添加到一个文件中,它确实消除了空值问题 - 所以我确信它会起作用。
我的脚本任务中的当前代码是:
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);
}
但后来我不知道如何添加这些标签!
答案 0 :(得分:1)
info_2
,其中填充了找到的元素的副本作为其内容以下是一个例子:
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;
}