2011-01-14 4 views
0

Я serching для элемента в файле XML, используя следующий LINQ к XML-запросапроблема в Non-ASCII поиск символов в файле XML с помощью LINQ к XML

XElement inspections = XElement.Load(new StreamReader(Server.MapPath(ResolveUrl(SelectInspection.InspectionFilePath)),Encoding.UTF8)); 

XElement inspection = (from elements in inspections.Elements("inspection") 
             where elements.Element("inspectionid").Value == inspectionId.ToString() 
             && elements.Element("databasename").Value == Encoding.UTF8.GetString(Request.ContentEncoding.GetBytes (Request.QueryString("DbName"))) 
             select elements).Single(); 

И мой файл XML является

<?xml version="1.0" encoding="utf-8"?> 
<inspections> 
    <inspection> 
    <inspectionid>8</inspectionid> 
    <databasename>Åker</databasename> 
    <exported>false</exported> 
    </inspection> 
</inspections> 

Несмотря на то, что Request.QueryString("DbName") равно «Åker», запрос не возвращает никакого результата.

ответ

0

Я создал тестовый веб-страницу со следующим содержанием:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <a href="WebForm1.aspx?DbName=Åker">Test</a><br /> 
    <asp:Label runat="server" ID="lblTest"></asp:Label> 
    </form> 
</body> 
</html> 

Это код-за:

using System; 
using System.Linq; 
using System.Xml.Linq; 

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var xmlStr = "<?xml version=\"1.0\" encoding=\"utf-8\"?><inspections> <inspection> <inspectionid>8</inspectionid> <databasename>Åker</databasename> <exported>false</exported> </inspection> </inspections>"; 
     var inspections = XElement.Parse(xmlStr); 
     XElement inspection = (from elements in inspections.Elements("inspection") 
           where elements.Element("databasename").Value == Request.QueryString["DbName"] 
           select elements).FirstOrDefault(); 
     lblTest.Text = (inspection != null).ToString(); 

    } 
} 

Когда я нажимаю Test ссылки, текст lblTest становится True - так, запрос находит элемент как ожидалось.

В дополнение к решению Jon Skeet, которое, вероятно, устраняет проблему, вы можете передать неправильное значение параметра inspectionId, что приводит к неудачному поиску.

+0

Благодарим вас за ответ и код, который вы опубликовали. Запрос отлично работает для строки, но не для файла. Я попробовал следующий код в консоли, и я получаю ту же ошибку «Последовательность не содержит элемента»: Проверка XElement = XElement.Load (новый метод StreamReader («C: \\ Test \\ nonAscii.xml», Encoding.UTF8)) ; Проверка XElement = (от элементов в проверках.Элементы ("осмотр") \t \t \t \t \t \t \t \t \t где \t \t \t \t \t \t \t \t \t elements.Element ("DatabaseName"). Значение == "Aker" \t \t \t \t \t \t \t \t \t элементы выбора) .Single(); – Ehsan

+0

Извините, код выше работает правильно. Я не сохранил xml-файл (nonAscii.xml) в кодировке utf-8. Я думаю, что проблема - проблема. – Ehsan

2

Это выглядит не так со мной:

Encoding.UTF8.GetString(Request.ContentEncoding 
           .GetBytes(Request.QueryString("DbName"))) 

Почему бы не Request.QueryString уже имел соответствующее декодирование применяется в ASP.NET?

Я предлагаю вам разделить проблему на две половины:

  • Убедитесь, что LINQ к XML можно найти строку: сделать это в консольного приложения с жестко закодированными данными
  • Убедитесь, что вы можете получить право строки запроса: сделать это, войдя в Unicode в кодовых Request.QueryString("DbName") как целые

Я бы ожидать вы просто быть в состоянии использовать Request.QueryString("DbName") непосредственно.

+0

Благодарим за отзыв. На самом деле я просто добавил эти кодировки, чтобы убедиться, что ничего не случилось. Это было раньше, как вы писали. Я проверил, что файл Xml сохраняется с помощью utf-8 encodinf. чтобы ни один редактор не сохранил данные с использованием другой кодировки, а мой ключ глобализации (requestEncoding) установлен на utf-8. Преобразование кодировки в только что добавленном примере для устранения любой возможной проблемы. Я попытался запустить запрос в строке, он отлично работает. но не в файле. – Ehsan

+0

@Ehsan: Я предлагаю вам сбросить коды кода Unicode (как целые числа) значения при загрузке из файла. –