2016-08-02 68 views
0

当前我试图从XML列表中随机选择一个名称并将其打印在控制台中。但是,该节点似乎始终为空。我的XML看起来像这样: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

的[XML文档的SelectSingleNode返回null]可能的复制(HTTP://计算器.com/questions/17161317/xml-document-selectsinglenode-returns-null) –

+0

'/ ...'从根节点*中选择*,所以'/ nameData'不存在,是吗? –

回答

1

2个问题:

  1. 您添加rand而不是randValXPath字符串
  2. 你应该开始你的XPath//而不是/(就像你在从Count

变化所做的:

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

要:

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

您还可以删除位置()函数并使其如下所示:

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

协会的回答显示了如何解决您的问题,但另一个选择是完全去除的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)]; 
+0

关于使用XDocument.Load:我不相信Monogame允许这个命名空间......或者,至少,我似乎无法让它工作。 –

+0

@ChrisLyons我承认我不那么熟悉。但是,快速搜索似乎表明它的工作原理:您需要在文件中引用System.Xml.Linq.dll和使用System.Xml.Linq语句。 –

+0

引用那些给出此错误的信息:“命名空间'System.Xml'中不存在类型或名称空间名称'Linq'(您是否缺少程序集引用?)” –