none
名前空間を使用するとXPathExpression.AddSortがうまく機能しない RRS feed

  • 質問

  • VB2003で開発中です。

     

    XPathを使用して、XMLから情報を取得し、

    更にソートをかけようとしています。

     

    名前空間を使用しないパターンでは、

    取得及びソートはうまく出来たのですが、

    名前空間がついている場合、取得は出来るものの、

    AddSortの指定をしてもソートされた結果が得られません。

     

    Dim document As XPathDocument = New XPathDocument("C:\test.xml")
            Dim navigator As XPathNavigator = document.CreateNavigator()

            Dim expression1 As XPathExpression = navigator.Compile("/webtest:Test/webtest:AAA")
            Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
            manager.AddNamespace("webtest", "http://tempuri.org/ABC.xsd")
            expression1.SetContext(manager)

            expression1.AddSort("/webtest:Test/webtest:AAA/webtest:ID", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text)

            expression1.SetContext(manager)

            Dim iterator As XPathNodeIterator = navigator.Select(expression1)

     

    Selectの結果を見ると、Compileで指定した内容の情報は取得できているようですが、

    AddSortがまったく機能していません。

     

    ご教授お願いいたします。

    2007年7月13日 8:31

すべての返信

  • その後調べたところ、BUG報告がありました。

     

    http://support.microsoft.com/kb/316656/ja

     

    しかしながら、

    サンプルにあるファイルを、以下のようなファイルに修正してテストしたところ、

    属性の動作環境は確認できましたが、要素の場合うまくいきません。

     

    サンプルXMLファイルは次の通りです。

    <?xml version="1.0" encoding="utf-8" ?>
    <type xmlns='urn:Test'>
       <elements>
          <element name='element_1' order='1'>1</element>
          <element name='element_6' order='6'>6</element>
          <element name='element_7' order='5'>5</element>
          <element name='element_8' order='4'>4</element>
          <element name='element_9' order='3'>3</element>
       </elements>
    </type>

     

    属性の値を元にソートする処理は次の通りで、うまく動作しました。

     

      '属性の値を元にソートする

          Dim doc As New XPathDocument("C:\Testsort.xml")
            Dim nav As XPathNavigator = doc.CreateNavigator()

          Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(nav.NameTable)
            nsmgr.AddNamespace("test", "urn:Test")

          Dim expr As XPathExpression
            expr = nav.Compile("/test:type/test:elements/test:element")
            expr.SetContext(nsmgr)

          Dim expr2 As XPathExpression = nav.Compile("@order")
            expr2.SetContext(nsmgr)

         expr.AddSort(expr2, XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Number)
            expr.SetContext(nsmgr)

         Dim iterator As XPathNodeIterator = nav.Select(expr)
      

          Do While iterator.MoveNext()
                System.Diagnostics.Debug.WriteLine(iterator.Current.Value)
            Loop

     

    しかし、要素elementの値でソートしようとしましたがうまくいきません。

          Dim doc As New XPathDocument("C:\Testsort.xml")
            Dim nav As XPathNavigator = doc.CreateNavigator()

          Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(nav.NameTable)
            nsmgr.AddNamespace("test", "urn:Test")

          Dim expr As XPathExpression
            expr = nav.Compile("/test:type/test:elements")
            expr.SetContext(nsmgr)

          Dim expr2 As XPathExpression = nav.Compile("/element")
            expr2.SetContext(nsmgr)

         expr.AddSort(expr2, XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Number)
            expr.SetContext(nsmgr)

         Dim iterator As XPathNodeIterator = nav.Select(expr)
      

          Do While iterator.MoveNext()
                System.Diagnostics.Debug.WriteLine(iterator.Current.Value)
            Loop

     

    再度、ご教授お願いいたします。

    2007年7月17日 2:51
  • すいません。

    基本的な間違いをしていました。

    以下のようにして解決しました。

     

          Dim doc As New XPathDocument("C:\Testsort.xml")
            Dim nav As XPathNavigator = doc.CreateNavigator()

          Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(nav.NameTable)
            nsmgr.AddNamespace("test", "urn:Test")

          Dim expr As XPathExpression
            expr = nav.Compile("/test:type/test:elementstest:element")
            expr.SetContext(nsmgr)

         expr.AddSort(".", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Number)
            expr.SetContext(nsmgr)

         Dim iterator As XPathNodeIterator = nav.Select(expr)
      

          Do While iterator.MoveNext()
                System.Diagnostics.Debug.WriteLine(iterator.Current.Value)
            Loop

    2007年7月17日 3:02