2016-08-02 35 views
0

Derzeit versuche ich, einen Namen aus einer XML-Liste nach dem Zufallsprinzip auszuwählen und in der Konsole zu drucken. Der Knoten scheint jedoch immer null zu sein. Meine XML sieht wie folgt aus:C#/Monogame - Das Lesen in einem einzelnen Knoten aus XML gibt immer NULL zurück

<?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> 

und 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); 

Vielen Dank im Voraus für Ihre Hilfe

+2

Mögliche Duplikat [XML Document SelectSingleNode gibt null zurück] (http: // Stackoverflow .com/questions/17161317/xml-document-selectsinglenode-returns-null) –

+0

'/ ...' wählt * aus dem Wurzelknoten *, also '/ nameData' existiert nicht, oder? –

Antwort

1

2 Probleme:

  1. Sie die rand hinzufügen, anstatt die randVal an die XPath Zeichenfolge
  2. sollten Sie beginnen, Ihre XPath mit // statt / (wie Sie in der von

ändern Count tat

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

An:

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

Sie können auch entfernen die position() funktion und lass es so:

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

Guild Antwort zeigt, wie Sie Ihr Problem zu beheben, aber eine andere Möglichkeit ist, Ihr Vertrauen auf XPath vollständig zu entfernen:

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

In Bezug auf die Verwendung von XDocument.Load: Ich glaube nicht, dass Monogame diesen Namespace erlaubt ... Oder, zumindest, ich kann es nicht zum Funktionieren bringen. –

+0

@ChrisLyons Ich gebe zu, ich bin nicht so vertraut. Eine schnelle Suche scheint jedoch zu zeigen, dass es funktioniert: Sie benötigen einen Verweis auf 'System.Xml.Linq.dll' und eine' using System.Xml.Linq' Anweisung in Ihrer Datei. –

+0

Verweis auf diese geben diesen Fehler: "Der Typ oder Namespacename 'Linq' existiert nicht im Namespace 'System.Xml' (fehlt Ihnen eine Assembly-Referenz?)" –