Значение не попадает в ожидаемый диапазон исключений winrt

Я пытаюсь прочитать этот 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;
        }
    }

и я получаю это "Значение не попадает в ожидаемое исключение диапазона". Кто-то может сказать мне, почему?

2 ответа

Ваш XML-документ имеет два корневых элемента, оба типа "player".

Ваш код пытается загрузить это в 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 я хочу это:

        <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"/>

Это мой текстовый блок

Другие вопросы по тегам