2009-07-01 17 views
4

PerlとXML::Simpleモジュールを使用してXMLファイルを作成しています。私は正常にXMLファイルを作成しますが、問題は私のタグごとに<opt> </opt>タグがあることです。私は<opt> </opt>タグを使うことができるオプションを探しています。タグを削除するための後処理はできません。ファイルサイズが大きいためです。<opt>タグをXML :: Simple出力で削除するにはどうすればよいですか?

例:

<opt> 
    <person firstname="Joe" lastname="Smith"> 
    <email>[email protected]</email> 
    <email>[email protected]</email> 
    </person> 
    <person firstname="Bob" lastname="Smith"> 
    <email>[email protected]</email> 
    </person> 
</opt> 

及びIは、(タグ<opt>せず)を探しています:

+0

OPTはあなたのルートノードである場合、結果は単一のルートノードを持っている必要があります無効なXML、です。 – Axeman

+0

実際に私はrootnameを変更しました – joe

答えて

13
<person firstname="Joe" lastname="Smith"> 
    <email>[email protected]</email> 
    <email>[email protected]</email> 
    </person> 
    <person firstname="Bob" lastname="Smith"> 
    <email>[email protected]</email> 
    </person> 

タグは、ユーザが入力したデータ構造から生成されたXMLのルート要素です。アウト

ルート名=> '文字列' # - - XML::Simpleドキュメントから便利

デフォルトでは、XMLoutは() XMLを生成するときに、ルート要素は 'オプトイン' という名前になります。このオプションでは に代替名を指定できます。

undefまたは空の 文字列をRootNameオプションに指定すると、 はルート要素のないXMLを生成します。 ほとんどの場合、結果のXMLフラグメント は「整形式」ではないため、 は XMLin()で再度読み取ることができませんでした。それにもかかわらず、このオプションは、特定の 状況で有用であることがわかっている を持っています。

ブランクにルート要素を設定するには、RootNameを 'undef'としてXMLoutに渡すだけです。

use XML::Simple; 

my $xml = XMLout($hashref, RootName => undef); 
0

上記の回答は私には役に立たなかった。あなたができることは:

my $xml = XML::Simple->new(KeepRoot=>0); 
print $xml->XMLout($YourVariable); 

つまり、有効なXML文書にはルートが必要です。何がやりたいことは、あなたのルートノードを名前である場合は、あなたがこれを行うことができます。同じ情報(読み取り、解析、修正、および出力XMLを検索するとき

print $xml->XMLout({'RootNodeName' => {'ChildNode'=>[@ArrayOfThings]}}); 
1

が、私はこの答えに出くわした、<opt>ルートを修正タグ)がRubyにあります。

FYI、ルート・ノードも削除またはライブラリのRuby versionに名前を付けることができます。

require 'xmlsimple' # gem install xml-simple 
data = XmlSimple.xml_in(filename) # read data from filename 
# Parse data as needed, then output: 
XmlSimple.xml_out(data, { 'RootName' => nil })  # Remove root element 
XmlSimple.xml_out(data, { 'RootName' => 'html' }) # Change root <opt> to <html> 
関連する問題