XMLファイルの特定の属性名に基づいて重複タグを削除する方法は?

XMLファイルの特定の属性名に基づいて重複タグを削除する方法は?

「groupName」に基づいて重複行を削除して行を保持する方法はdirectoryId="1"

<Group id="123" groupName="ABC" lowerGroupName="abc" active="1" local="1" createdDate="2017-08-21 09:28:30.581" updatedDate="2017-08-21 09:28:30.581" type="GROUP" directoryId="10100"/>
<Group id="456" groupName="ABC" lowerGroupName="abc" active="1" local="0" createdDate="2017-08-21 09:28:30.634" updatedDate="2017-08-21 09:28:30.634" type="GROUP" directoryId="1"/>

ベストアンサー1

私はuniqこれがスペースで区切られたファイルや固定幅ファイル(たった2つの「列」関連オプションがあり、表示されるファイル--skip-fields--skip-charsで動作するため、必ずしも正しいツールだとは思いません。一方、ここにあるのはXMLと同様の列です。幅データには固定区切り記号や単純な単一文字区切り記号はありません(groupName原則として、等しい値にはスペースを含めることができます)。

代わりにXML処理ツールを使用します。

独自のスクリプトを作成しない1つのオプションはXPathベースのフィルタリングです。次の回答では、XPathを使用して一意性をフィルタリングする方法を学ぶことができます。これら- 重要な文法要素はfollowing-sibling::合軸ですpreceding-sibling::。 XPath式を評価するためのコマンドラインツールは、次の質問に対する回答にあります。この問題。私が試したことのうち、インストールが最も簡単なのはbasex(推奨)ここ)だから、以下で使用します。

あなたの質問を正しく理解したら、同じ行(XML要素)を持つ行を最後の行に減らしたいと思いますgroupName(または行がある行を選択する他の理由はありますかdirectoryId="1"?)。次のXML文書の場合:

<Groups>
<Group id="123" groupName="ABC" lowerGroupName="abc" active="1" local="1" createdDate="2017-08-21 09:28:30.581" updatedDate="2017-08-21 09:28:30.581" type="GROUP" directoryId="10100"/>
<Group id="456" groupName="ABC" lowerGroupName="abc" active="1" local="0" createdDate="2017-08-21 09:28:30.634" updatedDate="2017-08-21 09:28:30.634" type="GROUP" directoryId="1"/>
<Groups>

Groupsこれを達成するには、ルート要素()のすべての項目をラップする必要があります。正しい形式のXML、この要件は、次のXPath式を介して達成できます。

/Groups/Group[not(@groupName = following-sibling::Group/@groupName)]

/Groups/Group返す要素を選択し、の式を使用してフィルタリングします[]@プロパティを選択し、following-sibling::現在のプロパティのすべての後続の兄弟エントリと一致します(参照:ここ)。

これを実行すると、basex予想される結果が生成されます。

$ basex -i - '/Groups/Group[not(@groupName = following-sibling::Group/@groupName)]'

# [paste this into the terminal:]

<Groups>
<Group id="123" groupName="ABC" lowerGroupName="abc" active="1" local="1" createdDate="2017-08-21 09:28:30.581" updatedDate="2017-08-21 09:28:30.581" type="GROUP" directoryId="10100"/>
<Group id="456" groupName="ABC" lowerGroupName="abc" active="1" local="0" createdDate="2017-08-21 09:28:30.634" updatedDate="2017-08-21 09:28:30.634" type="GROUP" directoryId="1"/>
</Groups>

# [output:]

<Group id="456" groupName="ABC" lowerGroupName="abc" active="1" local="0" createdDate="2017-08-21 09:28:30.634" updatedDate="2017-08-21 09:28:30.634" type="GROUP" directoryId="1"/>

これとは対照的に、欠点は、uniqXMLbasex文書全体が最初にメモリに読み込まれるため、メインメモリサイズを超える非常に大きなファイルには適していないことです。いくつかのXMLプロセッサがあります。ストリーミング方式でのXML操作たとえば、XSLT 3.0にストリーミング変換があるため、大容量ファイルを処理する必要がある場合は、XSLT 3.0をサポートするプロセッサを使用して処理する方法があります。しかし、それまでは、独自の小さなストリームパーサーを手動で作成する方が簡単かもしれません。

おすすめ記事