2011-01-14 2 views
0

Ich serching für ein Element in einer XML-Datei folgende LINQ to XML-AbfrageProblem in Nicht-ASCII-Zeichensuche in XML-Datei mit Hilfe von XML Linq

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(); 

Und meine xml-Datei ist

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

Obwohl Request.QueryString("DbName") gleich "Åker" ist, gibt die Abfrage kein Ergebnis zurück.

Antwort

0

Ich habe einen Test Web-Seite mit folgendem Inhalt erstellt:

<%@ 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> 

Es ist Code-Behind:

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(); 

    } 
} 

Wenn ich Test Link klicken, wird der lblTest Text wird wahr - so, query findet das Element wie erwartet.

Zusätzlich zu Jon Skeets Lösung, die das Problem wahrscheinlich behebt, können Sie den falschen Wert inspectionId eingeben, was zu einer fehlgeschlagenen Suche führt.

+0

Vielen Dank für Ihre Antwort und den von Ihnen geposteten Code. Die Abfrage funktioniert für eine Zeichenfolge, aber nicht für eine Datei. Ich habe versucht, folgenden Code in der Konsole und ich bekomme den gleichen Fehler "Sequenz enthält kein Element": XElement Inspektionen = XElement.Load (neue StreamReader ("C: \\ Test \\ nonAscii.xml", Encoding.UTF8)) ; XElement Inspektion = (von Elementen in Inspektionen.Elemente ("Inspektion") \t \t \t \t \t \t \t \t \t wo \t \t \t \t \t \t \t \t \t elements.Element ("database"). Value == "Åker" \t \t \t \t \t \t \t \t \t Elemente auswählen) .Single(); – Ehsan

+0

Sorry, der obige Code funktioniert korrekt. Ich habe die XML-Datei (nonAscii.xml) nicht in der utf-8-Codierung gespeichert. Ich denke, Anfrage ist das Problem. – Ehsan

2

Dies ist für mich falsch aussieht:

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

Warum Request.QueryString bereits von ASP.NET nicht wäre, entsprechende Decodierung angewendet?

Ich schlage vor, Sie das Problem in zwei Hälften geteilt:

  • Stellen Sie sicher, LINQ to XML können die Zeichenfolge finden: dass mit hartcodierte Daten in einer Konsolenanwendung tun
  • Stellen Sie sicher, das bekommen rechts Query-String: tun, dass die Unicode-Codepoints innerhalb Request.QueryString("DbName") als ganze Zahlen, indem Sie

ich würde erwarten Sie nur in der Lage sein Request.QueryString("DbName") direkt zu verwenden.

+0

Vielen Dank für Ihre Antwort. Eigentlich habe ich nur diese Codierung hinzugefügt, um sicher zu sein, dass nichts falsch ist. Es war zuvor wie du geschrieben hast. Ich überprüfte die Xml-Datei wird mit utf-8 encodinf gespeichert. um sicher zu gehen, dass kein Editor die Daten mit einer anderen Kodierung gespeichert hat und mein Globalisierungsschlüssel (requestEncoding) auf utf-8 gesetzt ist. Kodierung Umwandlung in dem Beispiel nur hinzugefügt, um ein mögliches Problem zu beheben. Ich habe versucht, die Abfrage auf einer Zeichenfolge auszuführen, es funktioniert einwandfrei. aber nicht in der Datei. – Ehsan

+0

@Ehsan: Ich schlage vor, Sie die Unicode-Codepunkte (als Ganzzahlen) des Werts, wenn geladen aus einer Datei. –