2016-08-02 5 views
0

現在、XMLリストから名前をランダムに選択してコンソールに出力しようとしています。ただし、ノードは常にnullと思われます。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

可能な重複します(http:// stackoverflowの.com/questions/17161317/xml-document-selectinginglenode-returns-null) –

+0

'/ ...'はルートノード*から*を選択するので、 '/ nameData'は存在しません。 –

答えて

1

2問題:

  1. あなたがrand代わりのrandValを追加私のXMLは次のようになりますXPath文字列
  2. あなたはまた、削除することができます

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

    :へ

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

    :10

  3. あなたは(あなたがからCount

変更で行ったよう//の代わり/であなたのXPathを開始する必要があります位置()の機能を次のようにしてください。

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

ギルドの答えはあなたの問題を解決する方法を示しますが、別のオプションは、完全にXPathのへの依存を削除することです:[XMLドキュメントSELECTSINGLENODEがnullを返す]の

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およびSystem.Xml.Linq'ステートメントの参照が必要です。 –

+0

これらを参照すると、「タイプまたは名前空間の名前 'Linq'が 'System.Xml'名前空間に存在しません(アセンブリ参照がありませんか?)」 –

関連する問題