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
geeft als output:
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.
Geeft wel een geformatteerd output:
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