【问题标题】:Reading XML nodes in a C# program without the use of int.TryParse(node.InnerText)在不使用 int.TryParse(node.InnerText) 的情况下读取 C# 程序中的 XML 节点
【发布时间】: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 == ""吗?或者检查TryParsebool 结果,无论如何你都应该这样做

标签: c# xml innertext


【解决方案1】:

我...实际上并没有解决最初涉及 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。

【讨论】:

  • 你真的应该学会把那些大块的文本分成易于管理的段落。你的问题和你的答案都很难阅读和理解,因为文本墙很难解析。
  • 很抱歉。我已经对问题进行了更多细分,并且我还强调了问题中最重要的部分,以帮助使事情更加清晰。希望它有所帮助。
  • 别再把块引用放回去了。你没有引用任何人或任何东西,这不是个人留言板。如果你把它放回去,我会标记它,让版主锁定它。
  • 那么Okee dokee。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2013-08-31
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多