簡體   English   中英

我的Silverlight項目如何讀取我的xml文件?

[英]How to do my Silverlight project read my xml file?

我有一個大問題。 我必須在Silverlight中以不同的難度進行測驗。 我從不使用此框架,現在嘗試學習。 首先,我嘗試使用此框架讀取xml文件,並使用c#作為編程語言。 我寫了這段代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Browser;
using System.Data;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace quiz4
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            var quizzes = new List<Quiz>();
            var objSettings = new XmlReaderSettings();
            objSettings.IgnoreWhitespace = true;
            objSettings.IgnoreComments = true;
            const string booksFile = @"D:\quiz.xml";
            string element = "";

            using (XmlReader objReader = XmlReader.Create(booksFile, objSettings))
            {
                bool isLastElement = false;
                var quiz = new Quiz();
                var dx = new List<Answers>();

                while (objReader.Read())
                {

                    if (objReader.NodeType == XmlNodeType.Element)
                    {
                        element = objReader.Name;
                        if (element == "question")
                        {
                            quiz = new Quiz();
                            dx = new List<Answers>();
                            isLastElement = true;
                        }
                    }
                    else if (objReader.NodeType == XmlNodeType.Text)
                    {
                        switch (element)
                        {
                            case "questionText":
                                quiz.QuestionText = objReader.Value;
                                //Console.WriteLine("questionText: " + objReader.Value);
                                break;
                            case "LEVEL":
                                quiz.Level = objReader.Value;
                                //Console.WriteLine("LEVEL  " + objReader.Value);
                                break;
                            case "correct":
                                dx.Add(new Answers() { IsCorrect = true, AnswerName = objReader.Value });
                                //Console.WriteLine("correct: " + objReader.Value);
                                break;
                            case "incorrect":
                                dx.Add(new Answers() { IsCorrect = false, AnswerName = objReader.Value });
                                //Console.WriteLine("incorrect: " + objReader.Value);
                                break;
                        }
                    }

                    if (isLastElement)
                    {
                        quiz.AnswerList = dx;
                        quizzes.Add(quiz);
                        isLastElement = false;
                    }

                }
            }

        }

        class Quiz
        {
            public string QuestionText;
            public string Level;
            public List<Answers> AnswerList;//lista de raspunsuri
        }

        public class Answers
        {
            public bool IsCorrect;//raspuncul poate fi adevarat(true) sau false.
            public string AnswerName;//raspunsul
        }

XML檔案:

<?xml version="1.0" encoding="utf-8" ?>
<quiz>
<question>
<questionText>In Oracle SQL * PLUS, functia LOWER (col/value) permite:</questionText>
<LEVEL>2</LEVEL> 
<correct>fortarea caracterelor scrise cu litere mari sau mixte, in caractere scrise cu litere mici</correct>
<incorrect>fortarea caracterelor scrise cu litere mici in caractere scrise cu litere maric)</incorrect>
<incorrect>returnarea numarului de caractere din coloana sau valoarea literalad)</incorrect>
<incorrect>translatarea lungimii caracterelor dintr-o coloana/valoare la o lungime specificata</incorrect>
</question>

<question>
<questionText>In Oracle SQL * PLUS, functia INITCAP permite:</questionText>
<LEVEL>1</LEVEL> 
<incorrect>transformarea oricarei litere a unui cuvant, in litera mare</incorrect>
<correct>transformarea primei litere a fiecarui cuvant/coloana in litera mare</correct>
<incorrect>transformarea unei litere specificate a unui cuvant , intr-o litera mare </incorrect>
<incorrect>este o similitudine cu alte SGBD si nu exista specificata in SQL*PLYS</incorrect>
</question>
</quiz>

當我按F5鍵時,什么也沒發生。 為什么? 有人能幫我嗎? 謝謝!

Silverlight在瀏覽器的沙箱中運行,您的應用程序無法訪問本地文件系統(例如D:\\quiz.xml )。 您必須將Silverlight應用程序安裝為受信任的應用程序 ,才能完全訪問本地文件系統。

如果您設法在Silverlight中解決此限制,則應對應用程序進行另一處更改。 現在,您正在讀取MainPage類的構造函數中的XML(由於限制,我已經描述了拋出異常)。 您應將此代碼移入事件處理程序和事件處理程序中(例如,針對Loaded事件),但還應確保使用異步方法完成任何文件系統或網絡訪問。 例如,UI在異步回調中更新。

如果您正在學習C#,則會發現由於Silverlight施加的其他限制,編寫Silverlight應用程序將使您的注意力從簡單地學習語言上移開。

如先前的回答所述,您不能直接從Silverlight中的本地文件結構訪問文件。 通常,此方法是將文件(在您的情況下為quiz.xml)托管在Web服務器上,並讓Silverlight調用Web服務器以獲取文件。 您可以將文件承載在承載Silverlight應用程序的同一Web服務器上。 這是異步完成的,您可以在構造函數中啟動此調用。 另一件事是您讀取xml文件的方式,這對我來說有點奇怪,我更喜歡使用Linq到XML。 所以這是我會做的:

public partial class MainPage : UserControl
{
        private List<Quiz> quizzes;

        public MainPage()
        {
            InitializeComponent();

            var xmlUri = new Uri("http://yoursite.com/quiz.xml");
            var downloader = new WebClient();

            downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted);
            downloader.OpenReadAsync(xmlUri);
        }


        void downloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
           if (e.Error == null)
           {
              Stream responseStream = e.Result;

               using (var reader = XmlReader.Create(responseStream))
               {
                  var doc = XDocument.Read(reader);

                  quizzes = doc.Descendants("question")
                            .Select(q => new Quiz 
                            {
                               QuestionText = q.Element("questionText").Value, 
                               Level = q.Element("LEVEL").Value,
                               AnswerList = q.Descendants("incorrect")
                                             .Select(i => new Answers 
                                             { 
                                                IsCorrect = false, 
                                                AnswerName = i.Value 
                                             })
                                             .Union(
                                                q.Descendants("correct")
                                                 .Select(i => new Answers 
                                                 { 
                                                    IsCorrect = true, 
                                                    AnswerName = i.Value 
                                             })).ToList()

                            }).ToList();      
               }
           }
        }         
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM