Выбор XML-узлов с одинаковым именем, но другим внутренним текстом атрибута в C#

#c# #xml #world-of-warcraft

#c# #xml #world-of-warcraft

Вопрос:

 <item> 
    <title>Aerie Peak</title> 
    <link>http://www.wow-europe.com/realmstatus/index.html#Aerie Peak</link> 
    <description>Aerie Peak - Realm Down - Lang en - Type PvE</description> 
    <category domain="status">Realm Down</category> 
    <category domain="language">en</category> 
    <category domain="type">PvE</category> 

    <category domain="queue">false</category> 
    <guid isPermaLink='false'>EU5-REALM15</guid> 
</item>
  

Мне нужно выбрать title и status . Вот что я придумал:

 string uri = "http://www.wow-europe.com/realmstatus/index.xml"; 
XmlDocument doc = new XmlDocument();  
doc.Load(uri);

XmlNodeList nodes = doc.SelectNodes("//item");

foreach (XmlNode node in nodes)
{
   {
   RealmList.Text  = node["title"].InnerText   " - "   
       node.SelectNodes("category[@domain='status']")[0].InnerText;
   }
}
  

Однако это приводит System.NullReferenceException: Object reference not set to an instance of an object. к строке выбора. Я не уверен, как мне выбрать узел.

Комментарии:

1. Где именно возникает ошибка? У меня все работает нормально, когда я загружаю образец XML из файла. Сложно только node.SelectNodes("....").InnerText , потому что что, если этот узел отсутствует? Прежде всего, я бы сделал node.SelectSingleNode() и сохранил это в переменной XmlNode и убедился, что переменная является != null , прежде чем обращаться к ее .InnerText свойству…..

Ответ №1:

Ваш код отлично работает для вашего примера, но файл http://www.wow-europe.com/realmstatus/index.xml содержит по крайней мере один элемент item на момент написания, который не содержит элемента category.

Поскольку этот узел отсутствует, вы получаете исключение.

Я говорю об этом XML в верхней части http://www.wow-europe.com/realmstatus/index.xml.

 <item>
            <title>Alert</title>
            <link>http://www.wow-europe.com/realmstatus/index.html</link>
            <description><p><u><strong>Extended Maintenance 07/07</strong></u></p><p>We will be performing extended maintenance on the realms listed below on Wednesday, July 7th, beginning at 00:01 CEST. The maintenance is scheduled for 24 hours as we prepare for the upcoming expansion. These realms will be playable again at approximately 23:59 on Wednesday, July 7th.</p><p>All realms not listed below will undergo scheduled maintenance beginning at 05:00 CEST and will be available for play at approximately 11:00 CEST. </p><p>Additionally, paid character transfer will be unavailable for the duration of the maintenance.</p><p>[11:10] The maintenance has been extended for all realms. We apologise for any inconvenience this may cause and thank you for your patience while this is being resolved. </p><p>Balnazzar<br />Bloodfeather<br />Darksorrow<br />Defias Brotherhood<br />Earthen Ring<br />Frostwhisper<br />Genjuros<br />Haomarush<br />Hellscream<br />Laughing Skull<br />Lightning's Blade<br />Magtheridon<br />Neptulon<br />Nordrassil<br />Quel'Thalas<br />Ragnaros<br />Ravencrest<br />Runetotem<br />Shadowsong<br />Shattered Hand<br />Silvermoon<br />Skullcrusher<br />Spinebreaker<br />Stormrage<br />Stormreaver<br />Stormscale<br />Sylvanas<br />Terenas<br />The Maelstrom<br />The Venture Co.<br />Thunderhorn</p></description>
            <guid isPermaLink='false'>Alert</guid>

        </item>
  

Я думаю, что именно в этом заключается ваша проблема.

Комментарии:

1. Действительно, это была проблема. Мне нужно многому научиться, особенно некоторой базовой проверке на наличие исключений. Большое вам спасибо!

Ответ №2:

Вы также должны инициализировать RealmList и элемент ‘Text’ в RealmList, поскольку строка по умолчанию равна null.