[英]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.