У меня есть XML-файл, подобный этому:
<SiteConfig>
<Sites>
<Site Identifier="a" />
<Site Identifier="b" />
<Site Identifier="c" />
</Sites>
</SiteConfig>
Файл доступен для редактирования пользователем, поэтому я хочу предоставить разумное сообщение об ошибке на случай, если я не смогу его правильно проанализировать. Я мог бы написать .xsd для него, но это кажется излишним для простого файла.
Так или иначе, когда я запрашиваю список <Site>
узлов, я могу сделать это несколькими способами:
var doc = XDocument.Load(...);
var siteNodes = from siteNode in
doc.Element("SiteConfig").Element("Sites").Elements("Site")
select siteNode;
Но проблема в том, что если пользователь не включил узел <SiteUrls>
(скажем), он просто выдаст NullReferenceException
, который мало что говорит пользователю о том, что на самом деле пошло не так.
Другая возможность - это просто использовать Elements()
везде вместо Element()
, но это не всегда срабатывает при соединении со звонками на Attribute()
, например, в следующей ситуации:
var siteNodes = from siteNode in
doc.Elements("SiteConfig")
.Elements("Sites")
.Elements("Site")
where siteNode.Attribute("Identifier").Value == "a"
select siteNode;
(то есть, нет эквивалента Attributes("xxx").Value
)
Есть ли что-то встроенное в каркас, чтобы немного лучше справиться с этой ситуацией? Я бы предпочел версию Element()
(и Attribute()
, пока мы на ней), которая выдает описательное исключение (например, «Поиск элемента в , но такой элемент не найден») вместо возврата null
.
Я мог бы написать свою собственную версию Element()
и Attribute()
, но мне просто кажется, что это настолько распространенный сценарий, что я должен что-то упустить ...