2017-09-26 4 views
0

I持って、次のXML形式、私は場合は、唯一の特定のクラスDのオブジェクトを検索し、インスタンスの値はそのオブジェクトのために空であるかどうかを確認する必要がありは見つけるとxmlファイル内の値を置き換えるためにシェルスクリプトで助けが必要

<object class="Class A"> 
<directory>someString1</directory> 
<attr> 
    <name>length</name> 
    <value>6</value> 
</attr> 
<attr> 
    <name>parent</name> 
    <value>1</value> 
</attr> 
<attr> 
    <name>Status</name> 
    <value>1</value> 
</attr> 
<attr> 
    <name>className</name> 
    <value>Class A</value> 
</attr> 
<attr> 
    <name>Instance</name> 
    <value>InstanceValue</value> 
</attr> 
</object> 
... 
<object class="Class D"> 
<directory>someString4</directory> 
<attr> 
    <name>length</name> 
    <value>8</value> 
</attr> 
<attr> 
    <name>parent</name> 
    <value>1</value> 
</attr> 
<attr> 
    <name>Status</name> 
    <value>1</value> 
</attr> 
<attr> 
    <name>className</name> 
    <value>Class D</value> 
</attr> 
<attr> 
    <name>Instance</name> 
    <value></value> 
</attr> 
</object> 
.... 

引数として与えられた値を空にして空にします。 XMLファイルには複数のオブジェクトがあり、XMLタグの名前と値はかなり繰り返されています。さらに、私はsuse Linux上でのみシェルスクリプトを使ってそれを行う必要があります。

シェルスクリプトとSEDの新機能です。私は自分のレベルをstackoverflowで既存の質問と回答を見つけるのに最善を尽くしましたが、関連するものは見つけられませんでした。 ご協力いただきまして誠にありがとうございます。

+2

私はXML/HTMLパーサ(xmlstarlet、xmllintを使用することをお勧め... )。 – Cyrus

+1

有効なxmlファイルとそのサンプルの出力を質問に投稿してください。 – Cyrus

+3

「シェルスクリプトのみで行う必要がある」と言ったときの制限事項を明確にすることはできますか?通常、これは「余分なソフトウェアをインストールすることはできません」という意味ですが、「perlとpythonは許可されていません」、あるいは「grepやsedのような単純なコマンドだけです。 –

答えて

0

必要に応じて動作するかどうか確認できますか?

#!/bin/bash 

VALUE="NewValue" 
sed -i data.xml -re " 
/Class D/,/<\/object>/ { 
    /<name.*>Instance<\/name>/,/<\/value>/ { 
     s/(<value.*>)(<\/value>)/\1${VALUE}\2/ 
    } 
} 
" 

それはあなたがxmlstarletを使用できる場合は、それ以外の場合は何も

+0

スクリプトを実行する前にXMLファイルをバックアップするのを忘れないでください。 –

+0

チャッキングしないでファイルを変更します。これは私が今までに聞いたことがあれば安心です。 –

+0

本物の壊れやすい。コメントを理解することができない、CDATAセクションを理解できない、名前空間を理解できない(ドキュメントのあるセクションの中で 'name'は本当に' {http://example.com/some/名前空間/接頭辞} name'); 'は' 'のスーパーセットであることも理解できません。 XML出力を生成するサービスを実行している人々は、新しいドキュメントが古いものの意味上の適切なスーパーセットであっても、何かを変更するたびに苦情を受け取るという意味で、この種の脆弱な処理を行うと、 –

2

を行うべきではない、そして名前の「インスタンス」を見つけ、あなたのクラスを見つけて、値がない場合は、新しい値を挿入する必要があり、あなたが行うことができます何かのように:

xml ed -L -u "//object[@class='Class D']/attr[name='Instance'][value='']/value" -v "new value" input.xml 

注:-Lインプレースファイルを編集します。これが望ましくない場合は取り外してください。

代わりに、XSLTでXMLを処理するためにxsltprocを使用することができます。

stylesheet.xslがある
xsltproc -o output.xml stylesheet.xsl input.xml 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="object[@class='Class D']/attr[name='Instance' and value='']/value"> 
    <xsl:copy> 
     <xsl:text>new value</xsl:text> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

xmlstarletを使用してXSLTテンプレートを作成する方法について議論するかもしれませんが、xmlstarlet自体がインストールされていないシステムでも実行できます。 –

+0

(OPは、libxsltパッケージの一部としてxsltprocを同梱しているSuSEを使用していることを示しているため、ベースラインインストールではすぐに使用できます)xmlstarletは存在する場合もあれば存在しない場合もありますOPのターゲット環境では、xsltprocは確かにです)。 –

+0

@CharlesDuffy - 良い点。 xsltprocの例を追加しました。 xmlstarletを使用してXSLTスタイルシートを作成することについてOPが私に話して欲しいと思ったら、私はできます。 –

関連する問題