Как проверить наличие элемента с XElement? - PullRequest
3 голосов
/ 28 июля 2010

Обратите внимание, в этом коде я пытаюсь проверить наличие элемента rdfs: range, прежде чем выбрать его. Я делаю это, чтобы избежать возможного исключения нулевой ссылки во время выполнения.

    private readonly XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
    private readonly XNamespace rdfs = "http://www.w3.org/2000/01/rdf-schema#";
    private readonly XElement ontology;

    public List<MetaProperty> MetaProperties
    {
        get
        {
            return (from p in ontology.Elements(rdf + "Property")
                    select new MetaProperty
                    {
                        About = p.Attribute(rdf + "about").Value,
                        Name = p.Element(rdfs + "label").Value,
                        Comment = p.Element(rdfs + "comment").Value,
                        RangeUri = p.Elements(rdfs + "range").Count() == 1 ?
                            p.Element(rdfs + "range").Attribute(rdf + "resource").Value :
                            null
                    }).ToList();
        }
    }

Это меня как-то раздражает, я действительно хочу сделать что-то вроде этого:

p.HasElements(rdfs + "range") ?
    p.Element(rdfs + "range").Attribute(rdf + "resource").Value :
    null

Однако нет способа HasElement(string elementName).

Полагаю, я мог бы создать расширение метода для этого, но мне интересно, есть ли что-то уже встроенное или есть другие способы сделать это?

Ответы [ 2 ]

7 голосов
/ 28 июля 2010

Вы можете использовать:

p.Elements(rdfs + "range").SingleOrDefault()

, который вернет null, если нет элементов.Он выдаст исключение, если имеется более одного совпадающего элемента - FirstOrDefault() позволит избежать этого, если это нежелательное поведение.

РЕДАКТИРОВАТЬ: Согласно моему комментарию, а также использовать преобразование из XAttribute в строкуОбработка пустых значений:

return (from p in ontology.Elements(rdf + "Property") 
        select new MetaProperty 
                   { 
                       About = p.Attribute(rdf + "about").Value, 
                       Name = p.Element(rdfs + "label").Value, 
                       Comment = p.Element(rdfs + "comment").Value, 
                       RangeUri = (string) p.Elements(rdf + "range")
                                            .Attributes(rdf + "resource")
                                            .FirstOrDefault()
                    }).ToList(); 

Если у вас во многих местах одна и та же вещь, вы можете написать метод расширения, который очень легко инкапсулирует это:

RangeUri = (string) p.FindAttribute(rdf + "range", rdf + "resource")
1 голос
/ 28 июля 2010

То же самое, но аккуратнее

return (from p in ontology.Elements(rdf + "Property") 
let xRange = p.Element(rdfs + "range") 
select new MetaProperty 
{ 
    About = p.Attribute(rdf + "about").Value, 
    Name = p.Element(rdfs + "label").Value, 
    Comment = p.Element(rdfs + "comment").Value, 
    RangeUri = xRange == null ? null : xRange.Attribute(rdf + "resource").Value 
}).ToList(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...