2011-12-11 8 views
0

linqでxpathを使用する必要があるため、私はWindow Phoneアプリケーションで作業しています。残念ながら、xpathは現在サポートされていません。私は、ユーザーがノードを選択するときに再帰的にドリルダウンするxmlファイルを持っています。 node()/ @ titleはリストボックスにロードされます。ユーザが選択し、そのようにする。私は通常、xpath述部を動的に構築します。例えばWindows上でlinq-to-xmlを使用して動的に述語を構築する電話

:私が使用したXPathで

<cfr> 
<chapter title="CHAPTER VI" volume="6"> 
    <subchapter title="SUBCHAPTER A" volume="6"> 
     <part number="600" title="PART 600"> 
      <subpart number="Subpart A" part="PART 600" title="Subpart A Farm Credit Administration"> 
       <section number="600.1" title="The Farm Credit Act." part="PART 600" link="12CFR600.1" type="cfr"/> 
       <section number="600.2" title="Farm Credit Administration." part="PART 600" link="12CFR600.2" type="cfr"/> 
      </subpart> 
     </part> 
     <part number="601" title="PART 601"> 
      <section number="601.1" title="The Credit Act." part="PART 601" link="12CFR6001.1" type="cfr"/> 
     </part> 
    </subchapter> 
    <part>......</part> 
</chapter> 
</cfr> 

/node()/node()/node()/node()[@title='PART 601']/node()[@title='The Music Act.']/@title 

私は、ユーザーがクリックし、どのインデックスしているか、深いを追跡します。私はC#でそのようなXPathの述語を構築します:

private String XpathBuilder(bool isParentNode) 
    { 
     int nCount = AcmSinglton.NodeCount; 
     StringBuilder nodeStr = new StringBuilder(); 
     nodeStr.Append("/node()/node()"); 

     for (int i = 0; i < nCount; i++) 
     { 
      if (i != 0) 
      { 
       nodeStr.Append("[@title = '" + AcmSinglton.TitlePredicatesArrayList.get(i - 1).toString() + "']/node()"); 
      } 
      else 
      { 
       nodeStr.Append("/node()"); 
      } 
     } 
     return nodeStr.ToString(); 
    } 

だから私は動的LINQからXMLを使用して述語を構築するためのアイデアを探しています。ここで

私がこれまで持っているものである。このような

XDocument xml = XDocument.Load(String.Format("Resourses/c{0}x{1}.xml", this.CFRTitle, this.Volume));    
      var nodes = from x in xml.Elements().ElementAt(nodeDepth).Elements() 
         select new Menus.Chapter 
         { 
          Title = x.Attribute("title").Value 
         }; 

      this.MainListBox.ItemsSource = nodes.ToList(); 

答えて

1

何か作業をする必要があります:

var currentLevelElements = doc.Root.Elements(); 
int depth = 0; 
while (currentLevelElements != null && depth < nodeDepth) 
{ 
    currentLevelElements = currentLevelElements.Elements() 
               .Where(x=> (string) x.Attribute("title") == AcmSinglton.GetTitle(depth)); 
    depth++; 
} 
var nodes = from x in currentLevelElements select new Menus.Chapter 
        { 
         Title = x.Attribute("title").Value 
        }; 

タイトル情報のためのシングルトンを照会する厄介なようだ - これはつまりべき依存関係ですあなたのメソッドに直接渡すことができます。

関連する問題