2012-07-26 2 views
2

J'accède à cette méthode à l'aide de WPF. Je sais que lorsque j'accède à des objets d'une méthode extérieure, je devrais utiliser un Dispatcher. Ou le "noeud" est une variable locale et il me donne:WPF: Référence d'objet non définie sur une instance d'un objet

La référence d'objet n'est pas définie sur une instance d'un objet.

Pourquoi?

Voici le code:

SpeechSynthesizer valery = new SpeechSynthesizer(); 
XmlDocument xmlNews = new XmlDocument(); 
xmlNews.Load(string.Format("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=tc&output=rss")); 
foreach (XmlNode node in xmlNews.SelectNodes("/rss/channel/item")) 
{ 
    valery.Speak(node.SelectSingleNode("/title").InnerXml); 
} 
+0

est 'xmlNews' attribué à quoi que ce soit? La même chose vaut pour 'valery' – JMK

+0

XmlDocument xmlNews = new XmlDocument(); SpeechSynthesizer valery = nouveau SpeechSynthesizer(); –

+3

'valery' pourrait être nul,' xmlNews' pourrait être nul et le résultat de 'node.SelectSingleNode' pourrait être nul. Si je suis honnête, je suspecte le dernier, ce qui signifie que l'appel de 'InnerXml' est tenté et déclenche l'exception. –

Répondre

2

Si je suis honnête, je pense node.SelectSingleNode est de retour nul, ce qui signifie que l'appel tenté de InnerXml déclenche l'exception.

Essayez les changements suivants:

foreach (XmlNode node in xmlNews.SelectNodes("/rss/channel/item")) 
{ 
    var titleNode = node.SelectSingleNode("/title"); 

    if (titleNode != null && !string.IsNullOrEmpty(titleNode.InnerXml)) 
     valery.Speak(titleNode.InnerXml); 
} 

Je mets le contrôle sur InnerXml aussi bien au cas où Speak ne peut pas prendre des chaînes nulles.

Je ne suspecte pas le XPath parce que ces méthodes retourneront des collections vides au lieu d'éléments NULL si le XPath ne trouve rien.

+0

Vous aviez raison! node.SelectSingleNode retourne null J'ai changé le code en foreach (nœud XmlNode dans xmlNews.SelectNodes ("/ rss/channel/item/title")) et ça marche comme je le voulais! Merci! –

0

Sortez votre barre oblique et réessayez. Voir ci-dessous:

SpeechSynthesizer valery = new SpeechSynthesizer(); 
XmlDocument xmlNews = new XmlDocument(); 
xmlNews.Load(string.Format("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=tc&output=rss")); 
foreach (XmlNode node in xmlNews.SelectNodes("/rss/channel/item")) 
{ 
    valery.Speak(node.SelectSingleNode("title").InnerXml); 
} 

Cela a fonctionné pour moi

Questions connexes