在XML文件C#中不存在元素时,将null添加为值

时间:2015-09-08 18:28:12

标签: c# xml xpath

在C#中我使用以下方法从XML文件中获取一些元素:

var TestCaseDescriptions = doc.SelectNodes("//testcase/htmlcomment");

这样可以正常工作并获取正确的信息但是当我的测试用例没有htmlcomment时,它不会在XmlNodeList TestCaseDescriptions中添加任何条目。

如果没有htmlcomment,我希望得到值" null"作为TestCaseDescriptions的字符串。所以最后我会有一个类似

的XMLNodeList
  

htmlcomment

     

htmlcomment

     

     

htmlcomment

     

htmlcomment

任何人都可以描述或创建一个如何实现这一目标的示例吗?

2 个答案:

答案 0 :(得分:1)

var TestCaseDescriptions = doc.SelectNodes("//testcase/htmlcomment");
     

如果没有htmlcomment,我希望得到值" null"作为TestCaseDescriptions的字符串。

您的问题来自于如果没有htmlcomment,所选节点的数量将减少一个。当前的答案显示了当htmlcomment元素存在时要做什么,但是为空,但我认为你需要这样做,如果整个htmlcomment元素确实是空的:

var testCases = doc.SelectNodes("//testcase");
foreach (XmlElement element in testCases)
{
    var description = element.SelectSingleNode("child::htmlcomment");
    string results = description == null ? "null" : description.Value;
}​

在上面的代码中,您将遍历每个测试用例,并选择测试用例的子节点htmlcomment。如果找不到,SelectSingleNode会返回null,因此最后一行会检查结果并在这种情况下返回"null",否则返回节点的值。

要将此结果更改为节点,您必须将节点创建为当前节点的子节点。你说你想要一个XmlNodeList,所以这可能适合你:

var testCaseDescriptions = doc.SelectNodes("//testcase");
foreach (XmlElement element in testCaseDescriptions)
{
    var comment = element.SelectSingleNode("child::htmlcomment");
    if (comment == null)
    {
        element.AppendChild(
            doc.CreateElement("htmlcomment")
            .AppendChild(doc.CreateTextNode("none")));
    }
}​

此后,节点集将更新。

注意:显然,OP提到element.SelectSingleNode("child::htmlcomment");不起作用,但element.SelectSingleNode("./htmlcomment");确实如此,即使从技术上讲,这些也是XPath中的相同表达式,并且应该根据微软的文档工作。

答案 1 :(得分:0)

试试这个

XmlDocument doc = new XmlDocument();
var TestCaseDescriptions = doc.SelectNodes("//testcase/htmlcomment");
foreach (XmlElement element in TestCaseDescriptions)
{
    string results = element.Value == null ? "" : element.Value;
}​