Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Perl/XML::libXML] XML-bericht formatteren

Pagina: 1
Acties:

  • _Peter2_
  • Registratie: November 2008
  • Laatst online: 16:27
Probleem:
Als een XML-bericht is voorzien van een een iets afwijkende opmaak (met indents) dan de standaard perl library voor XML hanteert (indent van 2 spaties) en een XML-bericht wordt in een perl-script aangepast dan resulteert de toString(1) van het DOM niet tot een netjes geformatteerd xml-bericht.

Voorbeeld
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<test>
     <node1>met text</node1>
     <node2>
          <node3/>
     </node2>
</test>


Perl:
1
2
3
4
5
6
7
8
#!/usr/bin/perl
use XML::LibXML;

my $xml = XML::LibXML->load_xml( location => 'file.xml' );
my ($node2) = $xml->findnodes('/test/node2[1]');
$node2->appendTextChild( "node3", "bar" );

print $xml->toString(1);


geeft als output:
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<test>
     <node1>met text</node1>
     <node2>
          <node3/>
     <node3>bar</node3></node2>
</test>


Workaround
Door de xml-file niet rechtstreeks te laden, maar eerst in een buffer te laden, daarin alle newlines te verwijderen en vervolgens alle spaties tussen tags te strippen wordt de output wel "netjes" geformatteerd.

Nu vind ik dit een vieze hack (die wel werkt) en vraag me af of er een nettere manier is.

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use XML::LibXML;

my $xmlString = "";
open FHI, '<', 'file.xml';
read FHI, $xmlString, -s 'file.xml';
close FHI;

$xmlString =~ s/[\x0A\x0D]//g;
$xmlString =~ s/\>\s*\</></g;
my $xml = XML::LibXML->load_xml( string => $xmlString );
my ($node2) = $xml->findnodes('/test/node2[1]');
$node2->appendTextChild( "node3", "bar" );

print $xml->toString(1);


Geeft wel een geformatteerd output:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<test>
  <node1>met text</node1>
  <node2>
    <node3/>
    <node3>bar</node3>
  </node2>
</test>

Diablo III: <GOT> Pteer#2475 --- POE: Dwergux


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Waarom zou je je uberhaupt druk maken om xml formatting?
Ik produceer standaard xml gewoon zonder indentations / formatting en mocht iemand het echt willen dan krijgen ze wel een xsl die de boel formatteert

  • Juup
  • Registratie: Februari 2000
  • Niet online

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • DXaroth
  • Registratie: Maart 2011
  • Laatst online: 24-08 19:58
Gomez12 schreef op woensdag 04 september 2013 @ 14:27:
Waarom zou je je uberhaupt druk maken om xml formatting?
Ik produceer standaard xml gewoon zonder indentations / formatting en mocht iemand het echt willen dan krijgen ze wel een xsl die de boel formatteert
XML is een semi-readable format, dat er van uit gaat dat het leesbaar (tot zeker niveau) is voor mensen... het format wat jij uitspuwt is minder leesbaar.

Ja, XSL kan dat allemaal fixen, maar dat is een omweg vinden voor de luiheid van de developer om zn zooi netjes af te leveren.
Tenzij natuurlijk in de specificaties staat dat alle niet-essentiele data (lees: newlines en whitespace/tabs) niet opgeslagen dienen te worden...

  • _Peter2_
  • Registratie: November 2008
  • Laatst online: 16:27
Dank je voor de link naar die module.

De XML wordt gebruikt om gegevens bij te houden van ontvangen bestanden. Hierover komen ook weleens vragen, daarom is het prettig om de XML direct al te kunnen lezen.

Diablo III: <GOT> Pteer#2475 --- POE: Dwergux