0

XML ファイル内のすべての prefix:namespace ペアを見つける必要があります。ユーザーは、任意の XML ファイルと、それに対してクエリを実行する任意の XPath を提供できます。XPath が評価されるときにそれらを設定するには、 prefix:uri マッピングを見つける必要があります。

現在、以下を使用しています。

selectNodes("//namespace::*[name() != 'xml'][not(../../namespace::*=.)]");

これはすべてのペアを返します。問題は、それが遅いことです。この回答を見ましたが、遅いです。これを行うための速い方法はありますか?これは、XML に対して XPath クエリを実行するためだけに必要です。

私はこれを Java (dom4j を使用) と .NET の両方で行っています。

ありがとう - デイブ

4

1 に答える 1

0

Michael KayDimitre Novatchevが提供するリンクされた質問への回答で提供されるコードに多くの変更を加えることはできません。

このコード (彼らのものも) は、各ノード (要素と属性) に 1 回だけ接触するため、内部のすべての実行時間distinct-values()O(n)ノードの数になります。最悪の場合、各ノードにはいくつかの名前空間が関連付けられているため、これらの n ノードをソートする必要があります。これはO(n*log n)、合理的なソート アルゴリズムです。

(: each namespace:uri-combination only once :)
distinct-values(
  (: analyze all nodes with namespace set, both attributes and elements :)
  /descendant-or-self::*/(.|@*)[namespace-uri(.)]
  (: build result string :)
  /concat(
    substring-before(name(), ':'), ': ', namespace-uri(.), '
'
  )
)
于 2013-01-25T00:55:26.323 に答える