微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不使用 int.TryParse(node.InnerText)

如何解决不使用 int.TryParse(node.InnerText)

以下是一段更大的 C# 代码。为方便起见,我只提供相关信息。

我正在尝试编写一个读取 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",没有实际上什么都不做。

总之。 如何明确区分 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>

解决方法

我...实际上并没有解决涉及 InnerText 破坏空节点的最初困境,但我确实找到了解决我最初问题的解决方法,所以我想我可能应该回答我自己的问题。

即使 InnerText 不能处理空节点,它实际上仍然没有对原始 XML 做任何事情。在 InnerText 的上下文中不是“”,但也不是“0”。所以,这是我的解决方案:我完全删除了 element.IsEmpty 的 if 语句。在程序的上下文中它总是错误的,所以它在功能上毫无意义。但是,我补充说,如果解析的整数等于 0 并且 InnerText 不等于 0,则取整数值,并将其减去 1。

if (tempTRES.entityType == 0 && !(preset.SelectSingleNode("DValue").InnerText == "0"))
  {
     tempTRES.entityType = tempTRES.DVal - 1;
  }
}

我正在做的事情并不假设您的 DValue 中会有负值,因为它本质上是用于其他所有内容的列表工具,因此剩下的就是在列出 DValue 时进行排除以确保它们大于或等于 0。

InnerText 仍在破坏我的空节点,如果有更好的解决方法我很想知道,但至少现在,这个解决方案让我能够可靠地分离我的 0。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?