如何在XML中编写带有空值的属性?

本文关键字:空值 属性 XML | 更新日期: 2023-09-27 18:18:48

我使用linq to xml为应用程序编写一个小配置文件,并且有点惊讶地发现XAttributes不接受null作为它们的值-它们会抛出异常。

Null对于我的配置中的许多属性来说是一个完全有效的值,我不想在任何地方都要Null检查属性:

            var attribute = _element.Attribute(attribute);
            var value = attribute == null ? null : attribute.Value;

我不想这样写代码的另一个原因是,它会使错误的类型名称变得更容易——例如,如果一个属性拼写错误,它就会像一个存在的属性一样,但是有一个空值,而不是抛出异常。

我目前的解决方案如下,但它看起来有点难看+像你不应该做的事情。

我已经敲了一个小类,使它更容易编写和读取xml,我使用一个字符串只包含null字符来表示一个空字符串。

为了简洁起见,我省略了除索引器以外的所有内容:

public class XContainerWrapper
{
    private readonly XElement _element;
    public XContainerWrapper(XElement xElement)
    {
        _element = xElement;
    }
    public string this[string attribute]
    {
        get
        {
            var value = _element.Attribute(attribute).Value;
            return value == "'0" ? null : value;
        }
        set
        {
            var valueToWrite = value ?? "'0";
            _element.Add(new XAttribute(attribute, valueToWrite));
        }
    }
}

如何在XML中编写带有空值的属性?

您可以编写自己的扩展方法,而不是XAttribute值getter:

public static class XmlExtensions {
  public static string SafeValue(this XAttribute attribute) {
    var value = attribute == null ? null : attribute.Value;
    return value;
  }
}

那么你可以使用

XAttribute a = null;
var value = a.SafeValue();