我正在使用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。
有什么想法吗?
答案 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值。