【问题标题】:Value does not fall within the expected range exception winrt值不在预期范围内异常 winrt
【发布时间】:2013-09-04 04:45:15
【问题描述】:

我正在尝试阅读此 xml:

    <player>
      <id>10101</id>
      <name>Ricardo Ferreira Rodrigues</name>
      <shirtnumber>1</shirtnumber>
      <position>Guarda Redes</position>
      <realteam>5</realteam>
   </player>

我有这个代码:

    private async void LoadXml()
    {

        try
        {
            StorageFolder storageFolder = Package.Current.InstalledLocation;
            StorageFile storageFile = await storageFolder.GetFileAsync("/users/1101046102/xml/players.xml");

            string xml = await FileIO.ReadTextAsync(storageFile, Windows.Storage.Streams.UnicodeEncoding.Utf8);

            var doc = XDocument.Parse(xml);

            txtnome.Text = (string)doc.Root.Element("name");
            txtshirtnumber.Text = (string)doc.Root.Element("shirtnumber");
            txtposition.Text = (string)doc.Root.Element("position");  
        }

        catch (Exception ex)
        {
            XmlTextBlock.Text = ex.Message;
        }
    }

我得到这个“值不属于预期范围异常”。谁能告诉我为什么?

【问题讨论】:

  • 您是否尝试在 xml 文件的顶部添加 xml 定义? &lt;?xml version="1.0"?&gt;
  • 它对我来说很好用,。这些值显示在 TextBlock 中,您会遇到异常。
  • ps2goat 如果您不放置 xml 版本标记,则不会出现异常。没有那个标签,代码也能正常运行
  • 你能发布你的 UI 代码吗?我相信您在 UI 中的文本框应用了一些规则

标签: c# xml windows-8


【解决方案1】:

您的 XML 文档有两个根元素,都是“播放器”类型。

您的代码正试图将其加载到 XDocument 中,因此遇到了问题。

尝试像这样将您的 xml 元素包装在容器节点中......

<players>
    <player /> <!-- copied from above -->
    <player /> <!-- copied from above -->
</players>

然后您需要重写查询以查看根元素的子节点。请注意,由于您有多个,您可能应该尝试将它们读入一个集合。

string xml = "<players>"
    + "    <player>"
    + "        <id>10101</id>"
    + "        <name>Ricardo Ferreira Rodrigues</name>"
    + "        <shirtnumber>1</shirtnumber>"
    + "        <position>Guarda Redes</position>"
    + "        <realteam>5</realteam>"
    + "    </player>"
    + "    <player>"
    + "        <id>10103</id>"
    + "        <name>Antonio Manuel</name>"
    + "        <shirtnumber>2</shirtnumber>"
    + "        <position>Defesa</position>"
    + "        <realteam>5</realteam>"
    + "    </player>"
    + "</players>";
        var doc = XDocument.Parse(xml);
        var rootNode = doc.Root;
        foreach (var child in rootNode.Descendants("player"))
        {
            // do something with the values of the child nodes here.
        }

请注意,在循环中,将这些值分配给您拥有的文本控件是没有意义的,因为只有集合中的最后一个会以用户可以使用的方式写出。

【讨论】:

  • 不能那样做,因为我的 xml 会有更多的玩家。
  • 这篇文章的重点是,您上面的代码对于包含单个播放器的 XML 来说可以正常工作,但是如果您的文件包含多个文件而没有按照我的建议将它们包装在根节点中,则会严重失败。您的文件结构将无法正常工作,因此您必须以不同的方式处理它。
  • “有多个根元素”。我得到这个错误
  • 我怎样才能让这个 xml 有很多玩家在代码中生成的文本块中显示它?
  • 就像我在上面展示的那样。不过,您将需要改变您的基本假设。您打算如何确切地在这 4 个文本框中显示多个玩家?如果您明白这一点,我们就有机会为您提供更多帮助。
【解决方案2】:

我想要的xml是:

        <player>
          <id>10101</id>
          <name>Ricardo Ferreira Rodrigues</name>
          <shirtnumber>1</shirtnumber>
          <position>Guarda Redes</position>
          <realteam>5</realteam>
       </player>
       <player>
          <id>10103</id>
          <name>Antonio Manuel</name>
          <shirtnumber>2</shirtnumber>
          <position>Defesa</position>
          <realteam>5</realteam>
      </player>

使用这个 xml 我收到错误“值不在预期范围内的异常”。

    <TextBlock Name="txtnome" HorizontalAlignment="Left" Margin="178,275,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>
    <TextBlock Name="txtshirtnumber" HorizontalAlignment="Left" Margin="178,300,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>
    <TextBlock Name="XmlTextBlock" HorizontalAlignment="Left" Margin="178,250,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>
    <TextBlock Name="txtposition" HorizontalAlignment="Left" Margin="178,325,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>

这是我的文本块

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多