8

.NETのXElementからxmlを保存しています。ToStringメソッドを使用していますが、フォーマットが希望どおりに表示されません(以下の例)。1行に最大2つのタグが必要です。どうすればそれを達成できますか?


貯蓄XElement.Parse("<a><b><c>one</c><c>two</c></b><b>three<c>four</c><c>five</c></b></a>").ToString()は私に与えます

<a>
  <b>
    <c>one</c>
    <c>two</c>
  </b>
  <b>three<c>four</c><c>five</c></b>
</a>

しかし、読みやすくするために、「3」、「4」、「5」は別々の行に配置したいと思います。

<a>
  <b>
    <c>one</c>
    <c>two</c>
  </b>
  <b>three
    <c>four</c>
    <c>five</c>
  </b>
</a>

編集:はい、これは構文的に異なり、「xmlの精神ではない」ことを理解していますが、私は実用的です。最近、わずか3行のメガバイトサイズのxmlファイルを目にしました。これらは、テキストエディター、ソース管理、および差分ツールにとって困難です。何かをする必要があります!上記のフォーマットの変更がアプリケーションと互換性があることをテストしました。

4

5 に答える 5

13

正確にその出力が必要な場合は、手動で行う必要があり、必要に応じてノードの周囲に空白を追加します。

XML文書のほとんどすべての空白は、インデントとしか考えていなくても重要です。シリアライザーにドキュメントのインデントを依頼すると、抽出できるコンテンツが変更されるため、可能な限り保守的になるように努めます。要素

<tag>foo</tag>

<tag>
    foo
</tag>

内容が異なり、シリアライザーが前者を後者に変更した場合、の内容を要求したときにXMLAPIから返される内容が変更されます<tag>

通常の経験則では、要素間に既存の非空白がある場合、インデントは適用されません。この場合、threeシリアライザーが必要なインデントを適用すると、タグ間のタグが変更されるため、自動的には何も行われません。


XML形式を制御できる場合は、このように要素とテキストの子を混在させることはお勧めできません。ここで<b>は、テキスト(three)と要素()の両方の<c>子があり、表示されているような問題が発生するためです。

于 2012-11-11T19:53:37.447 に答える
3

裸の「3つ」が原因で、フォーマットが希望どおりに機能していません。独自のタグに含まれていない理由はありますか?代わりに「b」の属性にする必要がありますか?

于 2012-11-11T19:15:27.267 に答える
3

同僚に理由を説明しました-ファイル形式を変更します。同じことを試してみることをお勧めします。ほとんどのxmlツールは空白が重要であると想定しているため、私が望んでいたことを実行することはほぼ不可能です。

于 2013-04-18T17:12:43.053 に答える
2

XMLは、コンピューターを対象とした情報交換形式です。空白は無関係であり(実際には場所とスキーマによって異なります)、そのため、どちらか一方を使用するのは任意です。

で使用し、 XmlWriter.SettingsプロパティXmlTextWriterを使用しXElement.Saveて好みに合わせて調整できるかどうかを確認できます。

于 2012-10-16T11:02:08.403 に答える
0

私は以前に(クライアントの要求のために)同様のことをしなければなりませんでした。私がやったのは、ブラウザでXMLを表示するため(うーん、私は知っています)、またはコンテンツのxmlファイルをダウンロードするためにのみ使用されるカスタム.ToString()メソッドを作成することだけでした。コードは計算効率が高い必要はなかったので、各タグの子をチェックし、「ぶら下がっている」テキストをそのように配置するだけでした。

最終的に、テキストを代わりに属性にする必要があることをユーザーに納得させることができました。

于 2013-04-23T21:47:38.470 に答える