[2375] Re: 要素を削除するには

投稿日 2019/02/10(Sun) 02:23:42
投稿者 通り道
参照先

こんにちは。
少し試してみたのですが、xpathを使用して削除する方法はないようです。
また、削除は、XML文章にしか手順がなく、親となる要素や対象の要素を
取得してから・・・ということもできないようです。
そのため、プロデル独自の、選択パスを使用して目的の要素をXML文章から
直接特定する必要があります。
※なお、プロデルは、XML要素から、親要素にたどる手順や項目はないようです。

今の状態では、削除対象を選択パスで特定できないため、XMLを少し変更します。
削除したい要素に、それを区別できるよう、属性を付加します。
(このとき、名前に属性を付けても、名前の要素しか削除できません)
--------
<?xml version="1.0" encoding="utf-8"?>
<果物一覧>
<果物 nm="みかん">
<名前>みかん</名前>
<値段 単位="円">50</値段>
<値段 単位="$">0.25</値段>
</果物>
<果物 nm="りんご">
<名前>りんご</名前>
<値段 単位="円">80</値段>
<値段 単位="$">0.50</値段>
</果物>
</果物一覧>
-----
そのうえで、以下のように選択パスで指定します。
----
「果物一覧\果物@nm=りんご」をデータから削除
----
(@を付加すると属性を表すというのは、XPathと似ています)
選択パスは、XPathとだいたい似ていますが、以下が違うようです。
・区切り文字が「/」ではなく「\」
・先頭に「\」がない。常に手順を実行するインスタンス基準となる。
・途中階層を省略できない。XPathには、「//」とすると、
 その部分は任意の階層数とマッチする(先頭でも途中でも使える)。
 (xpathの場合、「//名前」として、任意の階層にある「名前」要素の列挙ができる)
・属性で判定する際に、名前のワイルドカードがない
 XPathでは、「*」がある。
 (選択パスの値段@=$は、xpathでは値段[@="$"]ですが、*[@="$"]も使えます)
・要素のフィルタリングとして、属性に対する=しか無い と思われる。
・パス中で指定可能な相対要素がない。xpathには親要素や次/前の兄弟要素を
 指定する方法がある(特定の要素の次の要素 とかも1度で抽出できる)
また、選択パスで取得しよとした場合に、マッチするものが複数ある場合、
取得しようとしている要素の階層そのものが複数ある場合(親要素が共通の場合)には
それらを配列として取得できるのですが、親要素が異なるものがある場合には、
親要素が共通となる範囲でしか配列に含まれません。例えば、以下です
----
項目は、「果物一覧\果物」をデータから得る ' 2つ取得される
項目は、「果物一覧\果物\名前」をデータから得る ' 1つだけ取得される
----

おすすめの方法は、ドットネット機能を使用して、System.Xml.*を
直接利用する方法です。必要となる機能だけをラッピングした種類を
作成して、plugin化して利用するのが良いと思ます。


関連一覧ツリー

をクリックするとツリーを一括表示します)

返信フォーム

(この投稿に返信する場合は下記フォームから投稿して下さい)
(1MBまで)
(英数字で8文字以内)

- 投稿修正/削除フォーム -
処理 No パスワード

▲ページの先頭へ

- WebForum -