xml
このタグを複数回含むファイルがあります。</w:rPr>
これが使用される方法です
<w:rPr>
TO REMOVE
</w:rPr>
ただし、タグ自体の内容が異なる場合があります。 sedなどを使用して、および間<w:rPr>
のすべての項目を削除して</w:rPr>
から2つのタグを削除する方法はありますか?
関連ネームスペース
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
およびファイル自体(フォーマットされた有効なXML)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:lvl w:ilvl="0">
<w:rPr>
TO REMOVE
</w:rPr>
<w:rPx>
<w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
</w:rPx>
</w:lvl>
</root>
答え1
長い話を短く
お願いします、絶対に使用しないでくださいsed今回のミッションのために!
またはをsed
使用するたびに子猫を殺します。html
xml
これは課題ですxmlstarlet
(適切なXMLパーサー)と彼の友人道、このように:
xmlstarlet ed \
-L \
-N w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" \
-d '//w:rPr' file.xml
いくつかの説明:
-L
ファイルの編集飛行中良いsed -i
-N
設定XML名前空間、必要なら-d
xpath
式に一致するノードの削除
確認するxmlstarlet edit --help
使用basex
純粋なXQueryソリューション:
$ cat XQuery
declare namespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
copy $input := doc("/dev/stdin")
modify delete node $input//w:rPr
return $input
$ basex XQuery < file.xml
使用XQuery
とxidel
:
そして制限付きXQuery機能。
xidel --xml --xquery '
declare namespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
x:replace-nodes(//w:rPr, ())
' file.xml
理論:
コンパイル理論によると、XML/HTML は、以下に基づく正規表現を使用して解析できません。有限状態マシン。 XML/HTML の階層構造のため、以下を使用する必要があります。プッシュダウンオートマトン操作して左利き受容体ツールに似た構文の使用アクリル。
realLife©®™ ルーチンツールシェル:
次のいずれかを使用できます。
- xmllint
libxml2
xpath1 は通常デフォルトでインストールされます。 - xmlstarlet編集、選択、変換可能...デフォルトではインストールされていません、XPath1
- 道PerlモジュールXML::XPath、XPath1経由でインストール
- ベーシックX
basex
パッケージ、完全なXQuery 3.1はデフォルトではインストールされません。 - ヒデルXPath3、一部のXQuery 3(アップデートなし)
- サクソンリント私のプロジェクト、@Michael KayのSaxon-HE JavaライブラリXPath3のラッパー
あるいは、高級言語と適切なライブラリを使用することもできます。
Python~のlxml
( from lxml import etree
)
真珠~のXML::LibXML
、XML::XPath
、XML::Twig::XPath
、HTML::TreeBuilder::XPath
PHP DOMXpath
、この例を確認してください
確認する:HTMLタグで正規表現を使用する