3

単純な removeChild テストでは、xml 行は削除されますが、空の空白行が維持されます。なぜですか? ところで、ソース xml ファイルにはインデントがありますが、インデントを削除しても同じ結果が得られます。では、まだ空白が残っている場合に removeChild 行を削除できるという点は何ですか?

ファイルに出力する前に、結果の xml 行を再フォーマットする方法はありますか?

foreach my $XYZ ($doc->findnodes("//EE1"))
{
 my $library = $XYZ->parentNode;
 $library->removeChild($XYZ);
} 
print {$FH} $doc->toString(0);



RESULT IN OUTPUT FILE:
<?xml version="1.0"?>
<TopTag>
  <AA1>ZNY</AA1>
  <AA2>111</AA2>
  <BB1>
    <CC1>ZNY</CC1>
    <CC2>
      <DD1>
                     <-----blank line remains
        <EE2>2000</EE2>
      </DD1>
      <DD1>
                     <-----blank line remains
        <EE2>5000</EE2>
      </DD1>
    </CC2>
  </BB1>
  <AA1>ZNY2</AA1>
  <AA2>2</AA2>
</TopTag>
4

3 に答える 3

5

空行は、空白を含むテキスト ノードに由来します。次のドキュメントを検討してください。

<doc>
  <elem/>
</doc>

doc要素には次のノードが含まれます。

  • 改行と 2 つのスペース文字を含むテキスト ノード。
  • 要素を持つ要素ノードelem
  • 改行を含む別のテキスト ノード。

要素が削除されると、elemテキスト ノードのみが残り、空白行になります。

ドキュメントを再インデントする最も簡単な方法XML::LibXMLは、モジュールを使用することですXML::LibXML::PrettyPrintこの質問も見てください。

于 2013-10-14T22:00:56.890 に答える
0

no_blanksオプションを使用するload_xml()と、XML をインポートするときに余分な空白要素が自動的に削除されます。

use XML::LibXML;
my $dom = XML::LibXML->load_xml(location => $filename, no_blanks => 1);

空白が削除されるため、次を使用する必要があります。

print $dom->toString(1);

きれいにフォーマットされた出力を取得します。

于 2016-06-20T17:13:29.693 に答える