2016-08-02 7 views
0

В настоящее время я пытаюсь случайно выбрать имя из списка XML и распечатать его в консоли. Однако узел всегда имеет значение null. Мой XML выглядит следующим образом:C#/Monogame - Чтение в одном узле из XML всегда возвращает NULL

<?xml version="1.0" encoding="utf-8"?> 
<XnaContent xmlns:ns="Microsoft.Xna.Framework"> 
    <Asset Type="Object"> 

    <nameData> 
     <firstName> 
     <name>Charles</name> 
     <name>David</name> 
     <name>Bob</name> 
     <name>John</name> 
     </firstName> 
    </nameData> 


    </Asset> 
</XnaContent> 

И C#:

//create XML document 
XmlDocument doc = new XmlDocument(); 

//load in XML file to doc 
doc.Load("Content/XML/Names.xml"); 

Random rand = new Random(); 
int count = 1; 

//Set count to be the number of name nodes in the first name field 
count = doc.SelectNodes("//firstName/name").Count; 

//set randVal so it never exceeds amount of name nodes 
int randVal = rand.Next(count); 

// set objNode to the name at position() 
XmlNode objNode = doc.SelectSingleNode("/nameData/firstName/name[position() = " + rand + "]"); 

//Write the randomly chosen name to console 
Console.WriteLine(objNode.InnerText); 

Заранее спасибо за помощь

+2

Возможный дубликат [XML документа SelectSingleNode возвращает нуль] (HTTP: // StackOverflow .com/questions/17161317/xml-document-selectsinglenode-returns-null) –

+0

'/ ...' выбирает * из корневого узла *, поэтому '/ nameData' не существует, не так ли? –

ответ

1

2 проблемы:

  1. вы добавляете rand вместо того randVal к строке XPath
  2. вы должны начать свой XPath с // вместо / (так же, как вы делали в Count

Изменение от:

objNode = doc.SelectSingleNode("/nameData/firstName/name[position() = " + rand + "]"); 

To:

objNode = doc.SelectSingleNode("//nameData/firstName/name[position() = " + randVal + "]"); 

Вы также можете удалить положение() funtion и оставьте это следующим образом:

"//nameData/firstName/name[" + randVal + "]" 
0

ответ Гильдии показывает, как решить вашу проблему, но другой вариант, чтобы удалить зависимость от XPath полностью:

var doc = XDocument.Load("Content/XML/Names.xml"); 

var names = doc.Descendants("name") 
    .Select(x => x.Value) 
    .ToList(); 

var rand = new Random(); 

var name = names[rand.Next(names.Count)]; 
+0

Что касается использования XDocument.Load: я не верю, что Monogame допускает это пространство имен ... Или, по крайней мере, я не могу заставить его работать. –

+0

@ChrisLyons Я признаю, что я не настолько знаком. Быстрый поиск, похоже, показывает, что он работает: вам понадобится ссылка на 'System.Xml.Linq.dll' и' using заявление System.Xml.Linq' в вашем файле. –

+0

Ссылка на них дает эту ошибку: «Тип или имя пространства имен« Linq »не существует в пространстве имен« System.Xml »(вам не хватает ссылки на сборку?)» –

 Смежные вопросы

  • Нет связанных вопросов^_^