6

scala で XPath クエリを実行しようとしていますが、うまくいかないようです。私のXmlは次のようになります(簡略化):

<application>
  <process type="output" size ="23"> 
     <channel offset="0"/>
      ....
     <channel offset="4"/>
  </process>
  <process type="input" size ="16"> 
     <channel offset="20"/>
      ....
     <channel offset="24"/>
  </process>
</application>

process属性を使用して取得したいので、次のinputXPath クエリを使用します。

//process[@type='input']

これは動作するはずです。xpathtesterで確認しました 。これで、scala コードは次のようになります。

import scala.xml._
val x = XML.loadFile("file.xml")

val process = (x \\ "process[@type='input']")  // will return empty NodeSeq() !!!

最終的に空になり、process私が望むものをキャプチャしません。私はこのようにそれを回避しました:

val process = (x \\ "process" filter( _ \"@type" contains Text("input")))

これははるかに醜いです。元のクエリが機能しない既知の理由はありますか?

4

3 に答える 3

4

Scala 標準ライブラリがサポートするものを説明するために「XPath」を使用しないでください。XPath は本格的な式言語であり、これまでに 2 つの最終バージョンと作業中の 3 つ目のバージョンがあります。

せいぜい、Scala には XPath にインスパイアされた操作の非常に小さなサブセットがあると言えます。したがって、XPath 式を取得して、もう少し作業を行わずに直接 Scala に貼り付けることは期待できません。

サードパーティのライブラリを使用すると、次のような実際の XPath 式をより適切にサポートできます。

  • Xml のスケール
    • Scala ライブラリ
    • 「通常の Scala XML よりもはるかに XPath に似たエクスペリエンスを提供します。パスは XPath のように見え、同じように機能します (同じ関数と軸の多くを使用)」
    • 私がよく理解していれば、それはまだ実際のXPathではありません
    • Scala とうまく統合できるように設計されています
  • サクソン人
    • Java ライブラリ
    • オープンソース
    • XPath 2 (および XSLT 2) の完全かつ準拠したサポート
    • DOM やその他のデータ モデルで動作する XPath API がありますが、現時点では特定の Scala サポートはありません
于 2013-04-02T17:36:07.050 に答える