2016-11-03 17 views
6

tôi sử dụng mã perl này để đọc XML từ một tập tin, và sau đó ghi vào tập tin khác (kịch bản đầy đủ của tôi có mã để thêm thuộc tính):đọc XML từ và nộp trong khi vẫn giữ định dạng

#!usr/bin/perl -w 

use strict; 
use XML::DOM; 
use XML::Simple; 

my $num_args = $#ARGV + 1; 

if ($num_args != 2) { 
    print "\nUsage: ModifyXML.pl inputXML outputXML\n"; 
    exit; 
} 

my $inputPath = $ARGV[0]; 
my $outputPath = $ARGV[1]; 

open(inputXML, "$inputPath") || die "Cannot open $inputPath \n"; 

my $parser = XML::DOM::Parser->new(); 
my $data = $parser->parsefile($inputPath) || die "Error parsing XML File"; 

open my $fh, '>:utf8', "$outputPath" or die "Can't open $outputPath for writing: $!\n"; 
$data->printToFileHandle($fh); 

close(inputXML); 

tuy nhiên điều này không lưu giữ các ký tự như ngắt dòng. Ví dụ, XML này:

<?xml version="1.0" encoding="utf-8"?> 
<Test> 
    <Notification Content="test1  testx &#xD;&#xA;test2&#xD;&#xA;test3&#xD;&#xA;" Type="Test1234"> 
    </Notification> 
</Test> 

trở này:

<?xml version="1.0" encoding="utf-8"?> 
<Test> 
    <Notification Content="test1  testx 

test2 

test3 

" Type="Test1234"> 
    </Notification> 
</Test> 

tôi nghi ngờ tôi không viết để nộp đúng cách.

+0

Khi tôi nghĩ rằng "bảo quản ngắt dòng", đây không phải là tất cả những gì bạn nghĩ đến. Ở đây bạn đang tìm cách bảo toàn * mã hóa * trùng hợp ngẫu nhiên cho các ký tự CR/LF. – tjd

+1

Dường như XML :: DOM đặt trình xử lý mặc định để mở rộng mọi thứ (xem các dòng DOM.pm 2054-58). Bạn đã thử thách với điều đó để có được hành vi noexpand bạn muốn? – mghicks

+0

phần đó của XML :: DOM dường như không hoạt động đúng - nhờ đề xuất mặc dù – Warpin

Trả lời

4

Sử dụng XML::LibXML. Các mô-đun chính tham gia là XML::LibXML::ParserXML::LibXML::DOM (cùng với các mô-đun khác). Các đối tượng quay trở lại thường là XML::LibXML::Document

use warnings 'all'; 
use strict; 

use XML::LibXML; 

my $inputPath = 'with_encodings.xml'; 
my $outputPath = 'keep_encodings.xml'; 

my $reader = XML::LibXML->new(); 
my $doc = $reader->load_xml(location => $inputPath, no_blanks => 1); 

print $doc->toString(); 

my $state = $doc->toFile($outputPath); 

Chúng tôi không phải lần đầu tiên tạo ra một đối tượng nhưng có thể trực tiếp nói XML::LibXML->load_xml. Tôi làm điều đó như một ví dụ vì cách này người ta có thể sử dụng phương pháp trên $reader để thiết lập mã hóa (ví dụ), trước khi phân tích cú pháp nhưng bên ngoài hàm tạo.

Mô-đun này cũng thuận tiện hơn để xử lý.

XML::Twig cũng nên để mã hóa và cũng tốt hơn để xử lý.

-1

FYI, tôi có thể thực hiện việc này bằng cách chuyển sang trình phân tích cú pháp XML khác. Bây giờ sử dụng XML :: LibXML.

Cú pháp tương tự, ngoại trừ 'parse_file' thay vì 'parsefile' và thay vì 'printToFileHandle', bạn sử dụng 'toFile' với tên tệp. Ví dụ:

+0

Bạn có thể nhận xét câu trả lời này bằng zdim hoặc chỉnh sửa câu trả lời để cải thiện. – saurabheights

+0

Như bạn có thể biết bằng dấu thời gian 'đã trả lời', câu trả lời này đặt trước câu trả lời của zdim. – Warpin

+0

Ohh, tôi xin lỗi. (Nếu tự hỏi, nó không phải là sự bỏ rơi của tôi, chỉ đề cập đến trong trường hợp). – saurabheights

Các vấn đề liên quan