2014-01-30 1 views
1

Мое приложение позволяет пользователю говорить в микрофон, и программа будет разговаривать с пользователем. У меня есть ответы, сохраненные в XML-файле, и когда пользователь разговаривает, я хочу, чтобы программа проверила файл XML и отобразила случайный узел в разделе, который он должен. Ниже то, что мой файл XML выглядит следующим образом:Выбор случайных узлов из xml-файла

<?xml version="1.0" encoding="utf-8" ?> 

<MarcusXMLFile xmlns:Responses="http://www.rewardstrike.com/XMLFile1.xml""> 
    <response> 
    <posanswer> 
     <answer>Yes, sir.</answer> 
     <answer>Right away.</answer> 
    </posanswer> 
    </response> 
</MarcusXMLFile> 

Мой код для выбора случайного узла является:

private void Responses() 
{ 
    string query = String.Format("http://www.rewardstrike.com/XMLFile1.xml"); 
    XmlDocument Responses = new XmlDocument(); 
    Responses.Load(query); 

    XmlNode channel = Responses.SelectSingleNode("MarcusXMLFile"); 
    XmlNodeList nodes = Responses.SelectNodes("MarcusXMLFile/response"); 

    try 
    { 
     XmlNodeList positiveresponses = Responses.SelectNodes("./posanswer/answer"); 
     foreach (XmlNode ans in positiveresponses.Cast<XmlNode>().OrderBy(elem => Guid.NewGuid())) 
     { 
      response = ans.InnerText; 
     } 
     QEvent = "positiveresponse"; 
    } 
    catch { } 
} 

И мой код для вызова события является:

case "Hello": 
case "Hello Jarvis":   
    Responses(); 
    if (QEvent == "positiveresponse") 
    { 
       JMARCUS.Speak(response); 
    } 
    break; 

Однако , когда я говорю с приложением, это дает мне ошибку, говоря текст, который он должен говорить в нуле. Есть идеи?

+1

Вашей обработка исключений не является оптимальной .. скорее всего, есть некоторое полезное исключение происходит, но вы полностью игнорировать ее. –

+1

catch {} Это похоже на отключение детекторов дыма в спальне вашего ребенка. –

ответ

1

Ваш второй Responses.SelectNodes находки нет узлов, поэтому positiveresponses не имеет узлов, цикл foreach не имеет никакого отношения к перебирать дальше, и response никогда не присваивается значение.

Try изменение:

XmlNodeList positiveresponses = Responses.SelectNodes("./posanswer/answer"); 

To:

XmlNodeList positiveresponses 
    = Responses.SelectNodes("MarcusXMLFile/response/posanswer/answer"); 
+0

Это сработало. Не могу поверить, что я тоже пропустил это 0_0, это метод, который я использовал для выбора случайного узла, хорошего, или есть лучший способ? –

+0

Если использование GUID работает в вашей текущей ситуации, тогда обязательно. Одним из вариантов было бы использовать класс «Случайный» для генерации случайного числа с maxValue (эксклюзивным) «positiveresponses.Count». –

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