解析XML时检查元素是否存在

时间:2011-03-17 08:35:22

标签: c# xml

我正在解析XML。我通常按​​照我在下面的代码中显示的方式解析它很简单问题是我不拥有我正在解析的XML而且我无法更改它。有时没有缩略图元素(没有标签),我得到Exception

有没有办法保持这种简单性并检查元素是否存在?或者我必须首先使用LINQ获取XElement列表,然后检查它并仅填充现有的对象属性?

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    XDocument dataDoc = XDocument.Load(new StringReader(e.Result));

    var listitems = from noticia in dataDoc.Descendants("Noticia")
                    select new News()
                    {
                        id = noticia.Element("IdNoticia").Value,
                        published = noticia.Element("Data").Value,
                        title = noticia.Element("Titol").Value,
                        subtitle = noticia.Element("Subtitol").Value,
                        thumbnail = noticia.Element("Thumbnail").Value
                    };

    itemList.ItemsSource = listitems;
}

4 个答案:

答案 0 :(得分:43)

[编辑] Jon Skeet's answer应该是接受的答案。它更易读,更容易应用。 [/ edit]

创建一个像这样的扩展方法:

public static string TryGetElementValue(this XElement parentEl, string elementName, string defaultValue = null) 
{
    var foundEl = parentEl.Element(elementName);

    if (foundEl != null)
    {
        return foundEl.Value;
    }

    return defaultValue;
}

然后,改变你的代码:

select new News()
{
    id = noticia.TryGetElementValue("IdNoticia"),
    published = noticia.TryGetElementValue("Data"),
    title = noticia.TryGetElementValue("Titol"),
    subtitle = noticia.TryGetElementValue("Subtitol"),
    thumbnail = noticia.TryGetElementValue("Thumbnail", "http://server/images/empty.png")
};

这种方法允许您保持一个干净的代码,隔离元素存在的检查。它还允许您定义默认值,这可能会有所帮助

答案 1 :(得分:34)

而不是使用Value属性,如果你转换为字符串,你只需要获得一个空引用:

void wc_DownloadStringCompleted(object sender,
                                DownloadStringCompletedEventArgs e)
{
    XDocument dataDoc = XDocument.Load(new StringReader(e.Result));

    var listitems = from noticia in dataDoc.Descendants("Noticia")
                    select new News()
                    {
                        id = (string) noticia.Element("IdNoticia"),
                        published = (string) noticia.Element("Data"),
                        title = (string) noticia.Element("Titol"),
                        subtitle = (string) noticia.Element("Subtitol"),
                        thumbnail = (string) noticia.Element("Thumbnail")
                    };

    itemList.ItemsSource = listitems;
}

它使用从XElementstring的显式转换,它通过返回空输出来处理空输入。对XAttributeXElement所有可空类型的显式转换也是如此,包括可居住的值类型,例如int? - 如果您正在使用,则需要小心嵌套的元素。例如:

string text = (string) foo.Element("outer").Element("inner");
如果缺少inner

将提供空引用,但如果缺少outer,则仍会抛出异常。

如果您想要“默认”值,可以使用空合并运算符(??):

string text = (string) foo.Element("Text") ?? "Default value";

答案 2 :(得分:0)

您可以使用System.Xml.Serialization.XmlSerializer将其从xml反序列化为对象。然后,如果元素不存在,对象的属性将只获得它的默认值。

看看这里:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx 或新的道路 https://docs.microsoft.com/en-us/dotnet/api/system.xml.serialization.xmlserializer

答案 3 :(得分:0)

您可以使用以下代码:

string content = item.Element("Content") == null ? "" : item.Element("Content").Value;