0

現在、XML リストから名前をランダムに選択し、コンソールに出力しようとしています。ただし、ノードは常に null のようです。私のXMLは次のようになります:

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

よろしくお願いいたします。

4

2 に答える 2

1

2 つの問題:

  1. 文字列に のrand代わりにを追加しrandValますXPath
  2. の代わりに (で行ったようXPathに) で始める必要があります。///Count

から変更する:

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

に:

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

position() 関数を削除して、次のようにすることもできます。

"//nameData/firstName/name[" + randVal + "]"
于 2016-08-02T07:08:58.517 に答える
0

Guild's answer は、問題を解決する方法を示していますが、別のオプションは、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)];
于 2016-08-02T07:17:36.700 に答える