c#获取没有close标签明确的xml节点

时间:2015-06-27 12:34:59

标签: c# .net xml

这是我的xml

  <?xml version="1.0" encoding="utf-8" ?> 
 <SMS>
  <DeliveryDate>6/27/2015 3:00:00 PM</DeliveryDate> 
  <Status>DELIVRD</Status> 
  <Error /> 
  </SMS>

我想知道错误节点是否包含文本

我试过这个:

 XmlDocument doc = new XmlDocument();
                doc.LoadXml(responseMessage);
                string errorTagBody = doc.SelectSingleNode("ERROR").InnerText;
                if (string.IsNullOrWhiteSpace(errorTagBody))

但我得到了这个例外:

An unhandled exception of type 'System.NullReferenceException' occurred in TestStatus.exe

Additional information: Object reference not set to an instance of an object.

在这一行:

string errorTagBody = doc.SelectSingleNode("ERROR").InnerText;

有时候,xml可能是这样的:

  <?xml version="1.0" encoding="utf-8" ?> 
 <SMS>
  <DeliveryDate>6/27/2015 3:00:00 PM</DeliveryDate> 
  <Error>Not formatted mobile number </ERROR>
  </SMS>

4 个答案:

答案 0 :(得分:1)

这里的问题不在于它是一个自我关闭的标签。问题出在您选择节点上。

这说的是在文档的根部给我一个名为ERROR的元素。没有一个,所以它返回null,你在null上调用.InnerText,你得到一个空引用异常。

string errorTagBody = doc.SelectSingleNode("ERROR").InnerText;

而不是这样,你可以这样做,这意味着从文档中的任何位置获取Error元素。

string errorTagBody = doc.SelectSingleNode("//Error").InnerText;    

或者这个,意思是在路径SMS中输入错误元素,然后输入错误。

string errorTagBody = doc.SelectSingleNode("SMS/Error").InnerText;   

也;案例与XML有关。您无法使用Error关闭ERROR,它无效。

答案 1 :(得分:1)

尝试选择它。

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(responseMessage);
    var node  = doc.DocumentElement.SelectSingleNode("//Error");

    if (null != node && string.IsNullOrEmpty( node.InnerText ))
    {

    }

答案 2 :(得分:0)

您应该使用带有XPath语法的SelectSingleNode

doc.SelectSingleNode("//Error").InnerText

答案 3 :(得分:0)

第一个XML是CASE SENSITIVE所以如果你使用&#34;错误&#34;标记,搜索&#34;错误&#34;而不是&#34; ERROR&#34;

其次,SelectSingleNode使用XPath,这是一种引用xml节点的方法(你可以通过在google上搜索来找到更多关于XPath的信息)。你的情况下正确的XPath是&#34; //错误&#34;或&#34;短信/错误&#34; (每个人都有不同的工作方式,再次在google上搜索XPath以了解你想要使用哪个)。

运行此代码以查看发生了什么。

        XmlDocument doc = new XmlDocument();
        doc.LoadXml("[YUOR XML PATH]");
        XmlNode node1 = doc.SelectSingleNode("ERROR");
        XmlNode node2 = doc.SelectSingleNode("Error");
        XmlNode node3 = doc.SelectSingleNode("//ERROR");
        XmlNode node4 = doc.SelectSingleNode("//Error");
        XmlNode node5 = doc.SelectSingleNode("SMS/ERROR");
        XmlNode node6 = doc.SelectSingleNode("SMS/Error");

        if (node1 == null)
        { Console.WriteLine("Node 1 is null"); }

        if (node2 == null)
        { Console.WriteLine("Node 2 is null"); }


        if (node3 == null)
        { Console.WriteLine("Node 3 is null"); }


        if (node4 == null)
        { Console.WriteLine("Node 4 is null"); }


        if (node5 == null)
        { Console.WriteLine("Node 5 is null"); }


        if (node6 == null)
        { Console.WriteLine("Node 6 is null"); }