2016-11-03 9 views
6

संरक्षण दायर करने के लिए (मेरा पूरा स्क्रिप्ट गुण जोड़ने के लिए कोड है):एक्सएमएल पढ़ा से और जब तक मैं इस पर्ल कोड का उपयोग एक फ़ाइल से XML को पढ़ने के लिए, और फिर एक और फ़ाइल पर लिखने प्रारूप

#!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); 

लेकिन इस लाइन ब्रेक जैसे पात्रों को संरक्षित नहीं करता है। उदाहरण के लिए, इस XML:

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

इस हो जाता है:

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

test2 

test3 

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

मुझे लगता है मैं ठीक से दर्ज करने के लिए नहीं लिख रहा हूँ।

+0

जब मुझे लगता है कि "लाइन ब्रेक को संरक्षित करना" यह बिल्कुल दिमाग में नहीं आता है। यहां आप * एन्कोडिंग * को संरक्षित करना चाहते हैं जो संयोग से सीआर/एलएफ वर्णों का प्रतिनिधित्व करता है। – tjd

+1

ऐसा लगता है कि एक्सएमएल :: डीओएम सब कुछ विस्तारित करने के लिए एक डिफ़ॉल्ट हैंडलर सेट करता है (DOM.pm लाइन 2054-58 देखें)। क्या आपने उस अवांछित व्यवहार को पाने के लिए उसमें झुकाव करने की कोशिश की है? – mghicks

+0

एक्सएमएल :: डीओएम का वह हिस्सा सही काम नहीं कर रहा है - सुझाव के लिए धन्यवाद हालांकि – Warpin

उत्तर

4

उदाहरण के लिए XML::LibXML का उपयोग करें। शामिल होने वाले मुख्य मॉड्यूल XML::LibXML::Parser और XML::LibXML::DOM (दूसरों के साथ) हैं। लौटे वस्तु आम तौर पर 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); 

हम पहले एक वस्तु बनाने के लिए नहीं है, लेकिन सीधे XML::LibXML->load_xml कह सकता है। मैं इसे एक उदाहरण के रूप में करता हूं क्योंकि इस तरह से कोई भी $reader पर पार्सिंग से पहले, लेकिन कन्स्ट्रक्टर के बाहर, एन्कोडिंग सेट करने के लिए विधियों का उपयोग कर सकता है।

यह मॉड्यूल प्रसंस्करण के लिए और भी सुविधाजनक है।

XML::Twig को एन्कोडिंग भी छोड़नी चाहिए, और प्रसंस्करण के लिए भी बेहतर है।

-1

एफवाईआई, मैं विभिन्न एक्सएमएल पार्सर पर स्विच करके ऐसा करने में सक्षम था। अब एक्सएमएल :: LibXML का उपयोग कर।

सिंटेक्स समान है, इसे 'parsefile' के बजाय 'parse_file' को छोड़कर, और 'printToFileHandle' के बजाय आप फ़ाइल नाम के साथ 'toFile' का उपयोग करते हैं।

+0

आप इसे zdim द्वारा उत्तर पर टिप्पणी कर सकते हैं या सुधार के उत्तर को संपादित कर सकते हैं। – saurabheights

+0

जैसा कि आप 'उत्तर' टाइमस्टैम्प द्वारा बता सकते हैं, यह उत्तर zdim के उत्तर की भविष्यवाणी करता है। – Warpin

+0

ओह, मेरी माफ़ी। (अगर सोच रहा है, यह मेरा डाउनवोट नहीं है, बस मामले में उल्लेख)। – saurabheights

संबंधित मुद्दे