1

我正在使用 Linq to Xml 来解析一些来自遗留系统的 xml 消息。其中一条消息以名称/值对的形式出现。所以我正在按名称进行查找,然后尝试获取等效值。但是,当值为空白(<Value/>)时,我的代码会抛出错误Input string was not in a correct format.

我正在尝试找出解决此问题的最佳方法。任何建议将不胜感激(尝试用可为空的 int 类型 int 填充属性?)。

代码示例:

myRecord.myField= xdoc.Descendants("Information")
                        .Where(x => (string)x.Element("Name") == "myField")
                        .Select(x => (int?)x.Element("Value")).FirstOrDefault();

XML 片段:

    <Information>
      <Name>myField</Name>
      <Value />
    </Information>

始终感谢反馈/输入。

谢谢,

小号

4

3 回答 3

3

当元素为空时,它的值String.Empty不能被解析为整数。因此,您应该手动处理这种情况:

myRecord.myField = xdoc.Descendants("Information")
                       .Where(x => (string)x.Element("Name") == "myField")
                       .Select(x => x.Element("Value"))
                       .Select(v => (v == null || v.IsEmpty) ? null : (int?)v)
                       .FirstOrDefault();
于 2013-03-12T15:04:32.863 回答
0

这应该有效:

public static class Extensions
{
   public static int? ToInt32(this XElement element)
   {
      if (element == null) return null;
      if (element.IsEmpty) return null;

      // If the element is declared as <Value></Value>,
      // IsEmpty will be false, but the value will be an empty string:
      if (string.IsNullOrEmpty(element.Value)) return null;

      return XmlConvert.ToInt32(element.Value);
   }
}

myRecord.myField = doc.Descendants("Information")
   .Where(x => (string)x.Element("Name") == "myField")
   .Select(x => x.Element("Value").ToInt32()).FirstOrDefault();
于 2013-03-12T15:18:01.167 回答
0

已经提供了正确的答案,但我认为更多的解释会有所帮助。

整个事情即将XElement进行Nullable<T>显式转换。注意那个例子,看看发生了什么:

XElement element = null;
// returns null
int? value = (int?)element;

element = new XElement("test", 1);
// returns 1
value = (int?)element;

element = new XElement("test");
// throws FormatException
value = (int?)element;

(int?)xElementInstance仅返回null,其中元素为null. 否则,将处理 int 解析,这将引发异常,只要XElement.Value不是整数(就像在 out case 中,当没有Value,所以它就像int.Parse(String.Empty))。

您必须在转换之前检查is XElement setdoes XElement has value

if (element == null)
    return null;
else if (element.IsEmpty)
    return null
else if (string.IsNullOrEmpty(element.Value))
    return null
else
    return (int?)element;

使用 inline 语句可以轻松完成的工作:

(element == null || element.IsEmpty || string.IsNullOrEmpty(element.Value) ? null : (int?)element)

总而言之,以下代码执行您想要的操作 -int?从 XElement 获取,当元素没有值时发生事件:

element = new XElement("test");
// returns null
value = element == null || element.IsEmpty || string.IsNullOrEmpty(element.Value) ? null : (int?)element;
于 2013-03-12T15:05:10.170 回答