【发布时间】:2021-06-20 15:26:51
【问题描述】:
以下是一个更大的 C# 代码的 sn-p。为方便起见,我只提供相关信息。
我正在尝试编写一个读取 XML 变量并将它们放入列表的程序。然后,您可以根据 XML 中列出的名称从列表中选择一个名称,该特定名称的值随后会显示在表单中的一系列文本框中。 DValue 比较特殊,因为它是一个不一定要存在的值,所以也正因为如此,XML 表单中的几个元素都有 DValue 的空节点。空节点不应影响之前呈现的 DValue。
例如,如果我选择“Additional 1”,则值将列为 123、4、5、6,但如果我们将其更改为“Pt 3”,则值将是 123、7、8、9。空节点的 DValue 不能更改。
所以这就是问题所在。
我正在使用 int.TryParse(node.InnerText) 读取我的 XML 值,将它们转换为整数并将它们显示在表单的框中,但我最近发现 int.TryParse(node.InnerText) 读取每个节点说名字,这让事情变得很乱。 基本上,由于 int.TryParse 在失败时将 0 作为默认值,因此我所有的空节点都将变为 0,因此,当有空节点时,程序将无法识别。因此,每次我使用空节点引用某些东西时,它会将 DValue 视为 0,而不是什么都不做。我尝试编写一段代码来读取每个单独的 DValue,然后执行以下 if 语句:
if (element.IsEmpty)
{
DFound = false;
}
else
{
DFound = true;
int.TryParse(element.InnerText, out tempTRES.DVal);
}
但它仍然将空变量视为 0,因此对于变量 DFound,每个值都被视为“真”。我一直在研究一堆不同的潜在解决方案,但它们似乎都没有奏效,因为空变量要么变为零,要么根本不会加载整个节点系列,但我会暂且不说,因为这已经是一个相当长的问题了,老实说,我很难解释我所做的一些事情,但至少有一些值得注意的陈述:
- string DValueText = Convert.ToString(element):我尝试将每个节点的字符串值转换为整数,因此我永远不必使用 InnerText,但尝试读取节点只会破坏代码,因为我是还不完全清楚。
- element.InnerXml 什么都不做,element.Value 失败。
- 我尝试将 InnerText 设置为其他内容,这样我至少可以将空变量转换为可以在 if 语句中单独列出的内容,但我尝试使用 element.InnerText = "-100" 的方法没有t 实际上做任何事情。
总之。 如何明确区分 XML 节点何时为“0”和何时为空?另外,如果这看起来是一个非常简单的问题,我很抱歉。我对此进行了研究,但添加节点值的解决方案似乎总是围绕着使用 int.TryParse(node.InnerText) 的假设。最后,如果对此有什么不明白的地方,请告诉我。如前所述,这只是更大代码的一部分,因此很可能缺少一些上下文信息。 代码和 XML 可以在下面找到:
int.TryParse(TRES.SelectSingleNode("AValue").InnerText, out tempTRES.AVal);
int.TryParse(TRES.SelectSingleNode("BValue").InnerText, out tempTRES.BVal);
int.TryParse(TRES.SelectSingleNode("CValue").InnerText, out tempTRES.CVal);
//Note: Every TRES needs an DValue node, even if empty.
if (TRES.SelectSingleNode("DOS/TRES/DValue") == null)
{
XmlElement element = TRES.SelectSingleNode("DValue") as XmlElement;
if (element.IsEmpty)
{
DFound = false;
}
else
{
DFound = true;
int.TryParse(element.InnerText, out tempTRES.DVal);
}
}
viewTRES_.Add(tempTRES);
viewTRES_.Add(tempTRES);
cbDVizViewTRES.Items.Add(tempTRES.name);
}
<?xml version="1.0" encoding="utf-8"?>
<UNO>
<DOS>
<TRES Name="Pt 1">
<DValue></DValue>
<AValue>1</AValue>
<BValue>2</BValue>
<CValue>3</CValue>
</TRES>
<TRES Name="Pt 2">
<DValue></DValue>
<AValue>4</AValue>
<BValue>5</BValue>
<CValue>6</CValue>
</TRES>
<TRES Name="Pt 3">
<DValue></DValue>
<AValue>7</AValue>
<BValue>8</BValue>
<CValue>9</CValue>
</TRES>
<TRES Name="Additional 1">
<DValue>123</DValue>
<AValue>4</AValue>
<BValue>5</BValue>
<CValue>6</CValue>
</TRES>
<TRES Name="Additional 2">
<DValue>654</DValue>
<AValue>3</AValue>
<BValue>2</BValue>
<CValue>1</CValue>
</TRES>
<TRES Name="Additional 3">
<!--If you can really tell the difference between 0 and an empty variable, this shouldn't be a problem-->
<DValue>0</DValue>
<AValue>0</AValue>
<BValue>0</BValue>
<CValue>0</CValue>
</TRES>
</DOS>
</UNO>
【问题讨论】:
-
我认为这就是你想要做的:stackoverflow.com/questions/1295697/… 但你的问题太长了,很难说。
-
你不能只检查
InnerText == ""吗?或者检查TryParse的bool结果,无论如何你都应该这样做