1

こんにちは私は私のソリューションのためにn個の動的なwhere条件を使用したいと思います。

私のシナリオでは、すべてのxml要素をフェッチする必要があります。すべての要素には、strSearchContentのすべての単語を分割して作成された配列(arrSearchContents)のすべての要素が含まれている必要があります。

<Mobiles>
  <Mobile Id="1">
    <MDetails ModelNo="1" Desc="x phone color red"/>
    <MDetails ModelNo="2" Desc="x phone color green"/>
    <MDetails ModelNo="3" Desc="x phone color blue"/>
    <MDetails ModelNo="4" Desc="x phone color black"/>
    <MDetails ModelNo="5" Desc="x phone color yellow"/>
    <MDetails ModelNo="6" Desc="x phone color pink"/>
    <MDetails ModelNo="7" Desc="x phone color gray"/>
    <MDetails ModelNo="8" Desc="x phone color silver"/>
    <MDetails ModelNo="9" Desc="x phone color orange"/>
  </Mobile>
  <Mobile Id="2">
    <MDetails ModelNo="11" Desc="y phone color red"/>
    <MDetails ModelNo="12" Desc="y phone color green"/>
    <MDetails ModelNo="13" Desc="y phone color blue"/>
    <MDetails ModelNo="14" Desc="y phone color black"/>
    <MDetails ModelNo="15" Desc="y phone color yellow"/>
    <MDetails ModelNo="16" Desc="y phone color pink"/>
    <MDetails ModelNo="17" Desc="y phone color gray"/>
    <MDetails ModelNo="18" Desc="y phone color silver"/>
    <MDetails ModelNo="19" Desc="y phone color orange"/>
  </Mobile>
  <Mobile Id="3">
  ......
  <Mobile>
  ......
</Mobiles>

次のコードのようなソリューションが必要です。どんな体でもコードを修正できますか

public void doSearch(string strSearchContent)
{
string[] arrSearchContents;
arrSearchContents = strSearchContent.Split(' ');

string fileName = HttpContext.Current.Server.MapPath(@"~\XMLFiles/Mobile.xml");
XDocument doc = null;
    if (System.IO.File.Exists(fileName))
    {
        doc = XDocument.Load(fileName);

        IEnumerable<XElement> list1 =
            from elements in doc.Descendants("MDetails")
            where
                for(int i=0;i<arrSearchContents.Length;i++)
                {
                    elements.Attribute("Desc").Value.Contains(arrSearchContents[i]) &&
                }
            select elements;
    }
}

選択したリストには、検索文字列のすべてのキーワードが含まれている必要があります。

as per example : if strSearchContent = "phone color blue"

then as a result it should return :

<MDetails ModelNo="3" Desc="x phone color blue"/>
<MDetails ModelNo="13" Desc="y phone color blue"/>
4

2 に答える 2

4
from d in doc.Descendants("MDetails")
let desc = (string)d.Attribute("Desc")
where desc != null && 
      arrSearchContents.All(keyword => desc.Contains(keyword))
select d;

ただし、「bluephonecolor」にも一致します。単語を一致させたい場合は、正規表現を使用するか、説明を単語で分割できます。

!arrSearchContents.Except(desc.Split()).Any()
于 2013-01-10T11:29:31.193 に答える
2

ノード属性にバイスバースではなく値が含まれ ていることを確認する必要があります

var str = @"<Mobiles>
                    <Mobile Id=""1"">
                        <MDetails ModelNo=""1"" Desc=""x phone color red""/>
                        <MDetails ModelNo=""2"" Desc=""x phone color green""/>
                        <MDetails ModelNo=""3"" Desc=""x phone color blue""/>
                        <MDetails ModelNo=""4"" Desc=""x phone color black""/>
                        <MDetails ModelNo=""5"" Desc=""x phone color yellow""/>
                        <MDetails ModelNo=""6"" Desc=""x phone color pink""/>
                        <MDetails ModelNo=""7"" Desc=""x phone color gray""/>
                        <MDetails ModelNo=""8"" Desc=""x phone color silver""/>
                        <MDetails ModelNo=""9"" Desc=""x phone color orange""/>
                    </Mobile>
                    <Mobile Id=""2"">
                        <MDetails ModelNo=""11"" Desc=""y phone color red""/>
                        <MDetails ModelNo=""12"" Desc=""y phone color green""/>
                        <MDetails ModelNo=""13"" Desc=""y phone color blue""/>
                        <MDetails ModelNo=""14"" Desc=""y phone color black""/>
                        <MDetails ModelNo=""15"" Desc=""y phone color yellow""/>
                        <MDetails ModelNo=""16"" Desc=""y phone color pink""/>
                        <MDetails ModelNo=""17"" Desc=""y phone color gray""/>
                        <MDetails ModelNo=""18"" Desc=""y phone color silver""/>
                        <MDetails ModelNo=""19"" Desc=""y phone color orange""/>
                    </Mobile></Mobiles>";

    var doc = XDocument.Parse(str);
    var strSearchContent = "phone color blue";
    IEnumerable<XElement> list1 = doc.XPathSelectElements("//MDetails")
                                     .Where(node => node.Attribute("Desc").Value.Contains(strSearchContent));

    //LinqPad specific print call
    list1.Dump();

版画

<MDetails ModelNo="3" Desc="x phone color blue" /> 
<MDetails ModelNo="13" Desc="y phone color blue" /> 

結果のコードは次のようになります (メソッドの戻り値の型を変更したことに注意してください)。

public IEnumerable<XElement> doSearch(string strSearchContent)
{
    string fileName = HttpContext.Current.Server.MapPath(@"~\XMLFiles/Mobile.xml");

    if (File.Exists(fileName))
    {
        XDocument doc = XDocument.Load(fileName);
        return doc.XPathSelectElements("//MDetails")
                  .Where(node => node.Attribute("Desc").Value.Contains(strSearchContent));
    }

    return Enumerable.Empty<XElement>();
}
于 2013-01-10T11:28:58.143 に答える