web-dev-qa-db-ja.com

コマンドラインとしてXMLファイルからノードを削除する方法

タグ</w:rPr>を複数回含むxmlファイルがあります。このように使われています

<w:rPr><w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/></w:rPr>

ただし、タグ自体の内容が異なる場合があります。 sedまたは他の何かを使用して、<w:rPr></w:rPr>の間のすべてを削除する方法、そして両方のタグを使用する方法はありますか?

関連する名前空間

xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"

そして、ファイル自体の一部(フォーマットされた有効なXML)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:numbering xmlns:wpc="http://schemas.Microsoft.com/office/Word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.Microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.Microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.Microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.Microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.Microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.Microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.Microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.Microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.Microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.Microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.Microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-Microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-Microsoft-com:vml" xmlns:wp14="http://schemas.Microsoft.com/office/Word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-Microsoft-com:office:Word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.Microsoft.com/office/Word/2010/wordml" xmlns:w15="http://schemas.Microsoft.com/office/Word/2012/wordml" xmlns:w16cid="http://schemas.Microsoft.com/office/Word/2016/wordml/cid" xmlns:w16se="http://schemas.Microsoft.com/office/Word/2015/wordml/symex" xmlns:wpg="http://schemas.Microsoft.com/office/Word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.Microsoft.com/office/Word/2010/wordprocessingInk" xmlns:wne="http://schemas.Microsoft.com/office/Word/2006/wordml" xmlns:wps="http://schemas.Microsoft.com/office/Word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14">
  <w:abstractNum w:abstractNumId="0" w15:restartNumberingAfterBreak="0">
    <w:nsid w:val="FFFFFF89"/>
    <w:multiLevelType w:val="singleLevel"/>
    <w:tmpl w:val="CB2CEC0E"/>
    <w:lvl w:ilvl="0">
      <w:start w:val="1"/>
      <w:numFmt w:val="bullet"/>
      <w:pStyle w:val="Aufzhlungszeichen"/>
      <w:lvlText w:val="ï‚·"/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:tabs>
          <w:tab w:val="num" w:pos="360"/>
        </w:tabs>
        <w:ind w:left="360" w:hanging="360"/>
      </w:pPr>
      <w:rPr>
        <w:rFonts w:ascii="Symbol" w:hAnsi="Symbol" w:hint="default"/>
      </w:rPr>
    </w:lvl>
  </w:abstractNum>

  <!-- ... -->

 <w:abstractNum w:abstractNumId="16" w15:restartNumberingAfterBreak="0">
    <w:nsid w:val="6F8046F9"/>
    <w:multiLevelType w:val="hybridMultilevel"/>
    <w:tmpl w:val="1F3A6CE4"/>
    <w:lvl w:ilvl="0" w:tplc="DE32BBA8">
      <w:start w:val="1"/>
      <w:numFmt w:val="lowerLetter"/>
      <w:lvlText w:val="%1)"/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:ind w:left="682" w:hanging="567"/>
      </w:pPr>
      <w:rPr>
        <w:rFonts w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" w:cs="Arial" w:hint="default"/>
        <w:spacing w:val="-1"/>
        <w:w w:val="100"/>
        <w:sz w:val="22"/>
        <w:szCs w:val="22"/>
        <w:lang w:val="de-DE" w:eastAsia="de-DE" w:bidi="de-DE"/>
      </w:rPr>
    </w:lvl>

    <!-- ... -->

    <w:lvl w:ilvl="8" w:tplc="E4341C34">
      <w:numFmt w:val="bullet"/>
      <w:lvlText w:val="•"/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:ind w:left="7581" w:hanging="567"/>
      </w:pPr>
      <w:rPr>
        <w:rFonts w:hint="default"/>
        <w:lang w:val="de-DE" w:eastAsia="de-DE" w:bidi="de-DE"/>
      </w:rPr>
    </w:lvl>
  </w:abstractNum>

  <!-- ... -->

  <w:num w:numId="1">
    <w:abstractNumId w:val="15"/>
  </w:num>
  <w:num w:numId="2">
    <w:abstractNumId w:val="6"/>
  </w:num>

  <!-- ... -->

</w:numbering>
3
Felix

確かに、これは xmlstarlet (適切なXMLパーサー)と彼の友人 xpath のタスクです。

xmlstarlet ed -L \
              -N w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" \
              -d '//w:rPr' file.xml

少し説明:

  • -Lファイルを編集オンザフライのようにsed -i
  • -N設定XML名前空間(必要な場合)
  • -dxpath式に一致するノードを削除

チェックxmlstarlet edit --help

TL; DR

ください、決してこのタスクに sed を使用しないでください!

sedhtmlまたはxmlに使用するたびに、キティを殺します

理論:

コンパイル理論によると、XML/HTMLは 有限状態マシン に基づく正規表現を使用して解析できません。 XML/HTMLの階層構造のため、 プッシュダウンオートマトン を使用して操作する必要があります [〜#〜] lalr [〜#〜] 文法 [〜#〜] yacc [〜#〜]

realLife©®™日常のツール Shell

次のいずれかを使用できます。

xmllintlibxml2、xpath1とともにデフォルトでインストールされることが多い

xmlstarlet 編集、選択、変換できます...デフォルトではインストールされていません、xpath1

xpath PerlのモジュールXML :: XPath、xpath1を介してインストール

xidel xpath3

saxon-lint 自分のプロジェクト、@ Michael KayのSaxon-HEのラッパーJavaライブラリ、xpath3

または、高水準言語と適切なライブラリを使用できます。

python 's lxmlfrom lxml import etree

Perl 's XML::LibXMLXML::XPathXML::Twig::XPath 、- HTML::TreeBuilder::XPath

Rubynokogiriこの例を確認

phpDOMXpathこの例を確認


チェック: HTMLタグでの正規表現の使用

enter image description here

8
Gilles Quenot