В последнее время я использую XPathDocument и XNavigator для анализа XML-файла на предмет заданного XPath и атрибута. Это работает очень хорошо, когда я заранее знаю, что такое XPath.
Иногда, хотя XPath будет одним из нескольких возможных значений XPath, я хотел бы иметь возможность проверить, существует ли данный XPath.
В случае, если я неправильно понимаю номенклатуру, вот что я называю XPath - учитывая этот BLOB-объект:
<foo>
<bar baz="This is the value of the attribute named baz">
</foo>
Возможно, я ищу то, что я называю XPath «// foo / bar», а затем читаю атрибут «baz», чтобы получить значение.
Пример кода, который я использую для этого:
XPathDocument document = new XPathDocument(filename);
XPathNavigator navigator = document.CreateNavigator();
XPathNavigator node = navigator.SelectSingleNode("//foo/bar");
if(node.HasAttributes)
{
Console.WriteLine(node.GetAttribute("baz", string.Empty));
}
Теперь, если произойдет сбой вызова navigator.SelectSingleNode, он вернет исключение NullReferenceException или XPathException. Я могу поймать оба из них и рефакторировать вышеупомянутое в тест, чтобы видеть, возвращает ли данный XPath исключение, но мне было интересно, был ли лучший способ?
Я не видел ничего очевидного в Intellisense. XPathNavigator имеет .HasAttributes и .HasChildren, но если не считать итерации по пути по одному узлу за раз, я не вижу ничего более приятного в использовании.