0

次のlinq to xmlクエリを使用して、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>

is equal to "Åker"にもかかわらずRequest.QueryString("DbName")、クエリは結果を返しません。

4

2 に答える 2

2

これは私には間違っているように見えます:

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

Request.QueryStringASP.NET によって適切なデコードが適用されなかったのはなぜでしょうか?

問題を 2 つに分割することをお勧めします。

  • LINQ to XML が文字列を見つけられることを確認します。これは、ハードコードされたデータを使用してコンソール アプリで行います。
  • 正しいクエリ文字列を取得できることを確認してください。これは、Unicode コードポイントRequest.QueryString("DbName")を整数としてログに記録することによって行います。

直接使用できることを期待Request.QueryString("DbName")ています。

于 2011-01-14T09:55:20.027 に答える
0

次のコンテンツを含むテストWebページを作成しました。

<%@ 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になります。したがって、クエリは期待どおりに要素を検出します。

おそらく問題を修正するJonSkeetのソリューションに加えて、間違ったinspectionIdパラメータ値を渡すと検索が失敗する可能性があります。

于 2011-01-14T10:14:56.757 に答える