0

私が見つけた XML クエリの並べ替えの例のほとんどには、名前空間が含まれていません。それらのいくつかはそうですが、名前空間があるときにクエリを実行してソートする例は見つかりません。

 <Search xmlns="http://whatever.whatever.com/gg/whatever">
 <BinSet Type="Category">
 <Bin>
  <BinName>Clothing</BinName>
  <BinItemCount>804</BinItemCount>
   <BinParameter>
    <Name>Category</Name>
    <Value>Women's Apparel</Value>
  </BinParameter>
</Bin>
 <Bin>
  <BinName>Tools</BinName>
  <BinItemCount>126</BinItemCount>
   <BinParameter>
    <Name>Category</Name>
    <Value>Tools, handtools and hardware</Value>
  </BinParameter>
</Bin>
</BinSet>
</Search>

私は XML を制御できないので、名前空間を処理する必要があります。また、XML にはこれらのレコードが約 50 あり、それははるかに大きな XML ファイルの一部にすぎません。

Dim nsuri as string = "http://whatever.whatever.com/gg/whatever"
Dim xpath as string = "dd:Search/dd:BinSet[Type="Category"]/*"
Dim nav As XPathNavigator = doc.CreateNavigator()
Dim exp As XPathExpression = nav.Compile(xpath)
Dim nsmgr As New XmlNamespaceManager(nav.NameTable)
nsmgr.AddNamespace("dd", nsuri)
exp.SetContext(nsmgr)

exp.AddSort("BinParameter/Value", XmlSortOrder.Ascending, XmlCaseOrder.UpperFirst, "en-US", XmlDataType.Text)

' now process in sorted order
Dim iterator As XPathNodeIterator = nav.Select(exp)
While iterator.MoveNext
    Dim nav2 As XPathNavigator = iterator.Current.Clone
    nav2.MoveToFirstChild()
    Debug.WriteLine(nav2.Value) 
End While

私が見たすべての例は、直接の子ノードで並べ替える方法を示しています。たとえば、私の例の XML の BinName または BinItemCount です。しかし、このすべての情報が必要で、BinParameter/Value ノードでソートする必要があります。考えられるあらゆる方法を試しました...

最後に 1 つ注意しておきたいのは、すべてが完了した時点で XPathNodeIterator や XPathNavigator を使用することはあまり気にしないということです。以前は、これらすべてのレコードを含む XmlNodeList を返していました。呼び出しルーチンは、次のようにノードリストを走査してリンクを形成していました。

<a href="mypage.aspx?si=Tools">Tools, handtools and hardware (126)</a>
<a href="mypage.aspx?si=Clothing">Women's Apparel (804)</a>

名前空間を使用して、ネストされた子ノード「値」でこの XML を並べ替える方法を知っている人はいますか?

また、BinName、BinItemCount、Name、Value のすべての値にアクセスできるように、並べ替えられた結果を XmlNodeList またはその他の .Net オブジェクトで返す最も簡単な方法を教えてください。私は XPathNavigator または XPathNodeIterator に精通していません。

ありがとうございました。

4

1 に答える 1

0

xpath変数をに設定してみてください

/dd:Sets/dd:Bin/dd:BinParameter

次の AddSort 行を使用します

exp.AddSort("dd:Value", XmlSortOrder.Ascending, XmlCaseOrder.UpperFirst, "en-US", XmlDataType.Text)

dd:(すべての要素の接頭辞に注意してください)

編集:

Dim iterator As XPathNodeIterator = nav.Select(exp, nsmgr)
于 2012-04-25T21:16:57.430 に答える