即使XML元素存在,bool标志也设置为false

时间:2013-11-12 23:00:29

标签: c# .net xml linq

我正在使用bool标志检查以确保在将XML元素写入变量之前存在。

问题是我似乎得到了假阴性。我知道元素退出,因为我可以在XML示例中看到它。但是,该标志仍​​被设置为false ...

代码示例:

bool flag;

flag = xmlReader.ReadToFollowing("statusCode");
if(flag)
{
   statusCode = xmlReader.ReadElementContentAsInt();                                
}
else
{
   statusCode = 333;
}

flag = xmlReader.ReadToFollowing("statusDesc");
if (flag)
{
   statusDesc = xmlReader.ReadElementContentAsString();
}
else
{
   statusDesc = "";
}
flag = xmlReader.ReadToFollowing("Guid");
if (flag)
{
   guid = xmlReader.ReadElementContentAsString();
}
else
{
   guid = "";
}

XML示例:

<statusCode>0</statusCode>
<statusDesc/>
<Status/>
<WSKey/>
<Priority/>
<Guid>3A336A97-BCA3-43F8-849C-A40D129B25AA</Guid>

statusCode解析为true,statusDesc解析为false,但Guid也解析为false。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可能需要考虑使用LINQ to XML。

以下代码段在我的测试中有效:

    System.Xml.Linq.XDocument temp = System.Xml.Linq.XDocument.Parse("<root><statusCode>0</statusCode><statusDesc/><Status/><WSKey/><Priority/><Guid>3A336A97-BCA3-43F8-849C-A40D129B25AA</Guid></root>");
    var t = temp.Descendants("Guid").Any();

此致

答案 1 :(得分:1)

我和你有同样的结果。这是代码

 class Program {
    static void Main(string[] args) {
        var s = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
                "<root>" +
                "<statusCode>0</statusCode>" + 
                "<statusDesc/>" + 
                "<Status/>" + 
                "<WSKey/>" + 
                "<Priority/>" + 
                "<Guid>3A336A97-BCA3-43F8-849C-A40D129B25AA</Guid>" + 
                "</root>";
        var xmlReader = new XmlTextReader(
            new MemoryStream(
                Encoding.ASCII.GetBytes(s), false));

        bool flag;
        Int32 statusCode;
        String statusDesc;
        String guid;

        flag = xmlReader.ReadToFollowing("statusCode");
        if (flag) {
            statusCode = xmlReader.ReadElementContentAsInt();
        } else {
            statusCode = 333;
        }

        flag = xmlReader.ReadToFollowing("statusDesc");
        if (flag) {
            statusDesc = xmlReader.ReadElementContentAsString();
        } else {
            statusDesc = "";
        }
        flag = xmlReader.ReadToFollowing("Guid");
        if (flag) {
            guid = xmlReader.ReadElementContentAsString();
        } else {
            guid = "";
        }
    }
}

如果元素具有空值(例如statusDesc),似乎ReadToFollowing方法将返回false。在“flag = xmlReader.ReadToFollowing(”statusDesc“)行中设置一个断点;”并将程序运行到该行,如果您查看变量xmlReader,则其属性“EOF”已设置为true。这意味着它已经读到了xml的末尾。这将解释为什么在下次调用ReadToFollowing时无法找到Guid值。