それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

tidyコマンドでXMLインデント整形する

tidy 便利です.XMLも整形できます.送ってもらったXMLがインデントなしで、CDATAがあふれかえっているので、チョッと困ったので整形することにした.

XML整形で一番よく使うオプション

tidy --indent-cdata true -xml -utf8 -i ./sample.xml 

上に,出力ファイル名を加えたもの

tidy --indent-cdata true -xml -utf8 -i -o sample_out.xml ./sample.xml 

XMLを整形してインデントして,CDATAを整形してインデントしてくれる

たとえば

<?xml version="1.0"?><a><b/><content><![CDATA[これはテスト]]></content></a>

<?xml version="1.0"?>
<a>
  <b />
  <content>
    <![CDATA[これはテスト]]>
    </content>
</a>

になり格段に見やすくなる

出力ファイルは、入力ファイルより前に置くのがミソ

出力が入力より先なのでビックリする

--XXXX true オプションは全ての -X より前に置くのがミソ

--config-name value は -i などよりも前に置くとウマく解釈してくれる

ちなみに整形済みを元に戻すなら

 tidy  -xml -utf8 ./out.xml 2>/dev/null| tr -d '\n' > reverse.xml

かなぁ
tr 活用で,改行削除して スペースなしの一行XMLを作る.

折り返し無し

tidy のXML整形は、68を超えた行分はそこに収まるように 属性を折り返してくれる。attribute まで折り返さなくても良いんですが.そもそも折り返しはあんまり要らなかったりする.極端に多量の属性使うならノード使う方が良いよね?XMLって

tidy --wrap 0 --indent-cdata true -xml -utf8 -i 

wrap 0で折り返しを無効にする.出力は属性の折り返しなしで,1ノードが1行に収まって、インデントついて便利

tidy のインストール

本家からダウンロード
HTML Tidy Project Page

windows は

Windows版

linux

Linux は yum / apt から

cygwin

ビルド

ビルド方法

cygwin には tidy が無かったのでmake しました

コマンド

wget -O tidy.tar.gz http://tidy.cvs.sourceforge.net/viewvc/tidy/?view=tar
tar zxvf tidy.tar.gz
/bin/sh build/gnuauto/setup.sh
./configure
make
make install

setup.sh で configure を作るあたりがチョッとつまりどころ

やりたいこと。はXML整形

tidy でXMLを整形して読みやすくする

tidy のヘルプを読んでみる

./tidy -h
>tidy [option...] [file...] [option...] [file...]
>Utility to clean up and pretty print HTML/XHTML/XML
>See http://tidy.sourceforge.net/
>
>Options for HTML Tidy for Cygwin released on 25 March 2009:
>
>File manipulation
>-----------------
> -output <file>, -o  write output to the specified <file>                      
> <file>                                                                        
> -config <file>      set configuration options from the specified <file>       
> -file <file>, -f    write errors and warnings to the specified <file>         
> <file>                                                                        
> -modify, -m         modify the original input files                           
>
>Processing directives
>---------------------
> -indent, -i         indent element content                                    
> -wrap <column>, -w  wrap text at the specified <column>. 0 is assumed if      
> <column>            <column> is missing. When this option is omitted, the     
>                     default of the configuration option "wrap" applies.       
> -upper, -u          force tags to upper case                                  
> -clean, -c          replace FONT, NOBR and CENTER tags by CSS                 
> -bare, -b           strip out smart quotes and em dashes, etc.                
> -numeric, -n        output numeric rather than named entities                 
> -errors, -e         show only errors and warnings                             
> -quiet, -q          suppress nonessential output                              
> -omit               omit optional end tags                                    
> -xml                specify the input is well formed XML                      
> -asxml, -asxhtml    convert HTML to well formed XHTML                         
> -ashtml             force XHTML to well formed HTML                           
> -access <level>     do additional accessibility checks (<level> = 0, 1, 2, 3).
>                     0 is assumed if <level> is missing.                       
>
>Character encodings
>-------------------
> -raw                output values above 127 without conversion to entities    
> -ascii              use ISO-8859-1 for input, US-ASCII for output             
> -latin0             use ISO-8859-15 for input, US-ASCII for output            
> -latin1             use ISO-8859-1 for both input and output                  
> -iso2022            use ISO-2022 for both input and output                    
> -utf8               use UTF-8 for both input and output                       
> -mac                use MacRoman for input, US-ASCII for output               
> -win1252            use Windows-1252 for input, US-ASCII for output           
> -ibm858             use IBM-858 (CP850+Euro) for input, US-ASCII for output   
> -utf16le            use UTF-16LE for both input and output                    
> -utf16be            use UTF-16BE for both input and output                    
> -utf16              use UTF-16 for both input and output                      
> -big5               use Big5 for both input and output                        
> -shiftjis           use Shift_JIS for both input and output                   
> -language <lang>    set the two-letter language code <lang> (for future use)  
>
>Miscellaneous
>-------------
> -version, -v        show the version of Tidy                                  
> -help, -h, -?       list the command line options                             
> -xml-help           list the command line options in XML format               
> -help-config        list all configuration options                            
> -xml-config         list all configuration options in XML format              
> -show-config        list the current configuration settings                   
>
>Use --optionX valueX for any configuration option "optionX" with argument
>"valueX". For a list of the configuration options, use "-help-config" or refer
>to the man page.
>
>Input/Output default to stdin/stdout respectively.
>Single letter options apart from -f may be combined
>as in:  tidy -f errs.txt -imu foo.html
>For further info on HTML see http://www.w3.org/MarkUp
>

めんどくさそう・・・・

tidy でXMLのインデントを修正してみる

help ファイルを元にコマンドを考えてみる.

tidy -i -xml -utf8 sample.xml

CDATAがインデントされなくて崩壊する

出力ファイルを指定する
tidy -o out.xml -i -i -utf8 sample.xml
  • o オプションはインプットファイルより前に指定しないと動かなかった.

更に調べると,

より細かいオプションは

 tidy --input-xml true

のように --option-name true
または、 --option-name value

で指定する.とわかる

--XXXは何か

より詳細なオプションと言う位置づけっぽい

詳細オプションを全部見てみる

./tidy -show-config

>
>Configuration File Settings:
>
>Name                        Type       Current Value                           
>=========================== =========  ========================================
>accessibility-check         enum       0 (Tidy Classic)                       
>add-xml-decl                Boolean    no                                     
>add-xml-space               Boolean    no                                     
>alt-text                    String                                            
>anchor-as-name              Boolean    yes                                    
>ascii-chars                 Boolean    no                                     
>assume-xml-procins          Boolean    no                                     
>bare                        Boolean    no                                     
>break-before-br             Boolean    no                                     
>char-encoding               Encoding   ascii                                  
>clean                       Boolean    no                                     
>css-prefix                  String                                            
>decorate-inferred-ul        Boolean    no                                     
>doctype                     DocType    auto                                   
>doctype-mode                Integer   *1                                      
>drop-empty-paras            Boolean    yes                                    
>drop-font-tags              Boolean    no                                     
>drop-proprietary-attributes Boolean    no                                     
>enclose-block-text          Boolean    no                                     
>enclose-text                Boolean    no                                     
>error-file                  String                                            
>escape-cdata                Boolean    no                                     
>fix-backslash               Boolean    yes                                    
>fix-bad-comments            Boolean    yes                                    
>fix-uri                     Boolean    yes                                    
>force-output                Boolean    no                                     
>gnu-emacs                   Boolean    no                                     
>gnu-emacs-file              String                                            
>hide-comments               Boolean    no                                     
>hide-endtags                Boolean    no                                     
>indent                      AutoBool   no                                     
>indent-attributes           Boolean    no                                     
>indent-cdata                Boolean    no                                     
>indent-spaces               Integer    2                                      
>input-encoding              Encoding   latin1                                 
>input-xml                   Boolean    yes                                    
>join-classes                Boolean    no                                     
>join-styles                 Boolean    yes                                    
>keep-time                   Boolean    no                                     
>language                    String                                            
>literal-attributes          Boolean    no                                     
>logical-emphasis            Boolean    no                                     
>lower-literals              Boolean    yes                                    
>markup                      Boolean    yes                                    
>merge-divs                  AutoBool   auto                                   
>merge-spans                 AutoBool   auto                                   
>ncr                         Boolean    yes                                    
>new-blocklevel-tags         Tag names                                         
>new-empty-tags              Tag names                                         
>new-inline-tags             Tag names                                         
>new-pre-tags                Tag names                                         
>newline                     enum       LF                                     
>numeric-entities            Boolean    no                                     
>output-bom                  AutoBool   auto                                   
>output-encoding             Encoding   ascii                                  
>output-file                 String                                            
>output-html                 Boolean    no                                     
>output-xhtml                Boolean    no                                     
>output-xml                  Boolean    no                                     
>preserve-entities           Boolean    no                                     
>punctuation-wrap            Boolean    no                                     
>quiet                       Boolean    no                                     
>quote-ampersand             Boolean    yes                                    
>quote-marks                 Boolean    no                                     
>quote-nbsp                  Boolean    yes                                    
>repeated-attributes         enum       keep-last                              
>replace-color               Boolean    no                                     
>show-body-only              AutoBool   no                                     
>show-errors                 Integer    6                                      
>show-warnings               Boolean    yes                                    
>slide-style                 String                                            
>sort-attributes             enum       none                                   
>split                       Boolean    no                                     
>tab-size                    Integer    8                                      
>tidy-mark                   Boolean    yes                                    
>uppercase-attributes        Boolean    no                                     
>uppercase-tags              Boolean    no                                     
>vertical-space              Boolean    no                                     
>word-2000                   Boolean    no                                     
>wrap                        Integer    68                                     
>wrap-asp                    Boolean    yes                                    
>wrap-attributes             Boolean    no                                     
>wrap-jste                   Boolean    yes                                    
>wrap-php                    Boolean    yes                                    
>wrap-script-literals        Boolean    no                                     
>wrap-sections               Boolean    yes                                    
>write-back                  Boolean    no                                     
>
>
>Values marked with an *asterisk are calculated 
>internally by HTML Tidy
>

オプションが反映される様子

オプションをつけたら値が反映されることを確認.

tidy --indent-cdata true -show-config  > ./tidy.config

以上からXMLの整形は細かく指定できる

tidy --tab-size 2 --input-encoding utf8 --input-xml true --indent-cdata true -show-config  > ./tidy.config

などとすればオプションが変えられる
オプションの名前を間違えると,オプション値が入力ファイル名に解釈されるので注意が必要