К вашему сведению и вопреки распространенному мнению: InnerText
никогда не null
для атрибутов или элементов . Это означает, что вам не нужно проверять, является ли InnerText
нулевым. Пустые элементы и атрибуты имеют пустую строку для InnerText
:
XmlDocument docx = new XmlDocument();
docx.LoadXml("<root test='' />");
Debug.WriteLine("Empty: " + docx.FirstChild.InnerText);
Debug.WriteLine("Empty: " + docx.FirstChild.Attributes["test"].InnerText);
Однако сам атрибут может возвращать null
, если он не существует. И бесполезно, как уже указывалось jrista, использовать InnerText
, если только вам это не нужно. Придерживайтесь Value
вместо.
Решение вашей проблемы
Многие уже прокомментировали это. У вас есть:
XmlNodeList PackagesNode = InstalledList.GetElementsByTagName("installed");
foreach (XmlNode InstalledListNodes in PackagesNode)
{
if (InstalledListNodes.Attributes["title"].InnerText.Equals(packagename) == true)
....
с XML, который вы показали, это никогда не будет работать, так как <installed>
не имеет атрибутов. Попробуйте:
XmlNodeList PackagesNode = InstalledList.GetElementsByTagName("installed");
foreach (XmlNode InstalledListNodes in PackagesNode)
{
XmlNode someNode = InstalledListNodes.FirstChild;
if (someNode.Attributes["title"].InnerText.Equals(packagename) == true)
....
, который (пока) не даст желаемого эффекта, но someNode
теперь указывает на узел, который фактически содержит атрибут title, показывая вам, как избавиться от этой ошибки.
Более простое решение: SelectNodes
После удаления вашей ошибки я хотел бы показать вам другой путь: XPath. Этот тип задач действительно намного проще с использованием XPath. Вот мое мнение о вашей проблеме (не проверено):
// assuming <packages> is root:
XmlNodeList applicationNodes = InstalledList.SelectNodes("/packages/installed/*");
foreach (XmlNode applicationNode in applicationNodes)
{
if (applicationNode.Attributes["title"].Value.Equals(packagename) == true)
{
.... etc
Важное примечание: то, что другие сказали о проверке возвращаемых значений шагов узла, все еще очень важно. Если чего-то из ваших входных данных там нет, ваш код сильно потерпит неудачу. Просто проверяйте каждый шаг или используйте больше XPath, чтобы сделать вашу жизнь проще.
Обновление: К вашему сведению
Обновление: добавлено решение
Обновление: добавлено альтернативное решение (не устоял)