通过C#获取XML标签的属性值

时间:2016-07-20 15:23:00

标签: c# xml ssis

我有一个xml文档,如:

<start>
<action>
<message id="1" result="success">This is my message 1</message>
</action>
<action>
<message id="2" result="failure">This is my message 2</message>
</action>
<action>
<message id="2" result="success">This is my message 3</message>
</action>
</start>

我需要的是计算我在SSIS中的xml文件中有多少成功和多少失败消息。现在不允许将XML文件导入SSIS,因此我在控制流程中添加了一个脚本任务,并添加了下面的代码来读取xml:

XmlDocument doc = new XmlDocument();
doc.Load(Dts.Variables["filename"].Value.ToString());
XmlNode node= doc.SelectSingleNode("/start/action/hl7");
MessageBox.Show(node.Attributes["result"].InnerText);

这是返回第一条消息的结果,“仅成功;但我想看到其他2个结果(失败,成功)。它必须是因为SelectSingleNode方法,但我找不到像SelectMultipleNodes这样的东西,有没有其他选择?我尝试了下面的代码,但它给出了:Object reference not set to an instance of an object

foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
     //MessageBox.Show(node.InnerText);
     MessageBox.Show(node.Attributes["result"].InnerText);
}

但是,请注意MessageBox.Show(node.InnerText);显示xml中的所有三条消息,但我需要其“result”属性,我无法修复错误。另请注意,使用node.Attributes[1].InnerText会给出“索引已超出范围”错误。

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

最简单的解决方案是LINQ to XML。 XmlDocument比较长,并且有点痛苦。

如果您想获得成功的总数,例如:

var doc = XDocument.Load("filename.xml");

var success = doc.Descendants("message")
    .Attributes("result")
    .Count(result => result.Value == "success");

答案 1 :(得分:1)

我认为您正在寻找的功能可能是XmlNode.SelectNodes

var successes = doc.SelectNodes("/start/action/message[@result='success']").Count; // = 2
var failures = doc.SelectNodes("/start/action/message[@result='failure']").Count;  // = 1