0

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

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

代码示例:

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。

有任何想法吗?

4

2 回答 2

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();

问候,

于 2013-11-12T23:27:54.297 回答
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 值。

于 2013-11-13T01:43:42.303 回答