1

xpath値の配列xmlフィードがあります。

フィードが届いたら、xpathの配列にないノードを削除して各xmlファイルをフィルタリングしたいと思います。

私はこれを行うための非常に汚い方法を考えることができます:

1)xml内のノードごとに、そのxpathを形成します

2)配列内にあるかどうかを確認します。

3)そうでない場合は、削除します。

よりクリーンな方法はありますか?

4

2 に答える 2

1

アプローチは逆方向です(特定のノードは複数の有効なXPath式で選択できるため、エラーが発生しやすくなります)。あなたがすべき:

  • まず、式の配列を繰り返し、それぞれが選択するノードに何らかの方法でマークを付けます(たとえば、各ノードにフラグを設定するだけです)。さらに良い方法:すべての式の和集合を評価し、すべてを1つのステップで選択します。
  • 次に、DOMをトラバースし、最初のステップでマークされていない要素をすべて削除します。
于 2012-01-13T16:15:23.437 に答える
1

フィードが届いたら、xpathの配列にないノードを削除して各xmlファイルをフィルタリングしたいと思います。

ステップ1。指定されたXPath式で選択されていないすべてのノードを選択します

「ノード」とは要素を意味すると思います。もしそうなら、このXPath式

//*[count(. | yourExpr1 | yourExpr2 ... | yourExprN)
   >
    count(yourExpr1 | yourExpr2 ... | yourExprN)
   ]

NXPath式のいずれによっても選択されていないXMLドキュメント内のすべての要素を選択します。、、 yourExpr1 ... yourExpr2yourExprN

「ノード」とは、要素、テキストノード、処理命令ノード(PI)、コメントノード、および属性ノードを意味する場合、このXPath式を使用して、NXPath式で選択されていないすべてのノードを選択します。

(//node() | //*/@*)
   [count(. | yourExpr1 | yourExpr2 ... | yourExprN)
   >
    count(yourExpr1 | yourExpr2 ... | yourExprN)
   ]

ステップ2。手順1で選択したノードをすべて削除します。

上記のステップ1で選択したノードごとに、次を使用します。

 node.ParentNode.RemoveChild(node);

説明

  1. XPath union演算子|は、2つのノードセットの和集合を生成します。したがって、この式yourExpr1 | yourExpr2 ... | yourExprNをXMLドキュメントに適用すると、指定されたN個のXPath式のいずれかによって選択されるすべてのノードのセットが生成されます。

  2. ノードは、次の場合に正確に$nノードのセットに属しません。$ns

    count($n | $ns) > count($ns)

于 2012-01-14T20:48:04.943 に答える