【问题标题】:C#/Monogame - Reading in Single Node from XML always returns NULLC#/Monogame - 从 XML 中读取单个节点总是返回 NULL
【发布时间】:2016-08-02 06:59:26
【问题描述】:

目前我正在尝试从 XML 列表中随机选择一个名称并在控制台中打印它。但是,该节点似乎始终为空。我的 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);

提前感谢您的帮助

【问题讨论】:

标签: c# xml monogame selectsinglenode


【解决方案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 + "]"

【讨论】:

    【解决方案2】:

    Guild 的回答向您展示了如何解决您的问题,但另一种选择是完全消除您对 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)];
    

    【讨论】:

    • 关于使用 XDocument.Load:我不相信 Monogame 允许这个命名空间......或者,至少,我似乎无法让它工作。
    • @ChrisLyons 我承认我不是那么熟悉。不过,快速搜索似乎表明它有效:您需要在文件中引用 System.Xml.Linq.dllusing System.Xml.Linq 语句。
    • 引用这些会给出此错误:“命名空间 'System.Xml' 中不存在类型或命名空间名称 'Linq'(您是否缺少程序集引用?)”
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多