2

XML ファイルをコピーしてその一部を編集する必要があるものをハッキングしています。編集は問題ありませんが、興味深いことに、コピーは非常に難しい場合があります。これは基本的に「リバース エンジニアリング」作業であり、いくつかの要素の終了タグを何らかの方法で保持する必要があることがわかりました (要素に空白しか含まれていない場合や空であっても)。問題は、HXT が次のようなものを読み取るときです。

<tag>
</tag>

次に、それを次のように印刷します

<tag/>

withOutputXHTML関数のオプションを指定する明示的な終了タグ(またはそれを呼び出すもの)を常に使用するように指示できますが、次writeDocumentのように記述される要素があります

<tag/>

«そのまま» コピーする必要があります。

したがって、基本的に私の問題は次のようになります: «特定の要素の終了タグを保持してこのファイルをコピーするには?»:

<foo>
  <bar>
  </bar>
  <baz/>
</foo>

参照/実験用の単純なコピー プログラム:

module Main (main) where

import Control.Monad (void)
import Text.XML.HXT.Core

main :: IO ()
main = void $ runX $
       readDocument [ withValidate no ] "test.xml" >>>
       writeDocument [ withIndent yes
                     , withOutputEncoding isoLatin1
                     , withOutputXHTML ] "result.xml"
4

2 に答える 2

1

イライラする長い検索の後、 Text.XML.HXT.Arrow.XmlStateのすべてのオプションを試すことにしました。一部のオプションにはドキュメント文字列がないため、推測ゲームです。

最後に、私はこの驚異を見つけました:

withNoEmptyElemFor :: [文字列] -> SysConfig

ドキュメント文字列はありませんが、その名前は非常に有望に思えます。実際、このオプションの助けを借りて、«空にできない» 要素の名前を指定できます。

このオプションは writeDocument または と一緒に使用できますconfigSysVars。ローカルで使用できるため、2 番目の矢印の方が気に入っています。空であってはならないタグ​​のコレクションが異なる可能性がある、わずかに異なるドキュメントの処理を実行する矢印がいくつかある場合に便利です (私の場合です)。

したがって、私の例に戻ると、次のように記述して修正できます。

module Main (main) where

import Control.Monad (void)
import Text.XML.HXT.Core

main :: IO ()
main = void $ runX $
       readDocument [ withValidate no ] "test.xml" >>>
       writeDocument [ withIndent yes
                     , withOutputEncoding isoLatin1
                     , withNoEmptyElemFor ["bar"] ] "result.xml"
于 2015-05-03T12:00:56.997 に答える
0

便利な場合に備えて、空白の保持は xml-conduit のデフォルトの動作です。<tag>次の例では、要素が折りたたまれません。

{-# LANGUAGE OverloadedStrings #-}
import qualified Text.XML as X

main :: IO ()
main = do
    doc <- X.readFile X.def "foo.xml"
    X.writeFile X.def "bar.xml" doc
于 2015-05-03T13:19:03.167 に答える