मैं पर्ल को कैसे रोक सकता हूं XML::LibXML दशमलव से हेक्स में विशेष वर्णों को बदलने से, जैसे &#xA से &#10?

पर्ल कोड

use XML::LibXML;

open my $fh, '<', $File;
my $doc = XML::LibXML->load_xml(IO => $fh);
open (my $fh, '>', $File) or die $!;
print $fh $doc;
close $fh;

एक तृतीय पक्ष टूल (.net आधारित) और पर्ल स्क्रिप्ट को एक ही XML फ़ाइल से निपटने की आवश्यकता है।
तृतीय पक्ष टूल द्वारा जेनरेट किए गए XML में शामिल हैं:

<?xml version="1.0" encoding="utf-8"?>
<content>
<type sRemark="30 minutes.&#xA;&#xA;"/>
</content>

लेकिन, जब पर्ल स्क्रिप्ट उसी फ़ाइल को अपडेट करने का प्रयास करती है तो यह बदल जाती है:

<?xml version="1.0" encoding="utf-8"?>
<content>
<type sRemark="30 minutes.&#10;&#10;"/>
</content>

मैं उसी सामग्री को कैसे बनाए रख सकता हूं।

1
Robin Kendrick 22 अगस्त 2018, 16:17
1
आप शायद इसे बदल नहीं सकते। यदि आपके XML का सिंटैक्स महत्वपूर्ण है तो आप इसका सही उपयोग नहीं कर रहे हैं।
 – 
Borodin
22 अगस्त 2018, 18:08
2
आपके कोड में ऐसा कुछ भी नहीं है जो हेक्स वर्ण इकाइयां उत्पन्न करता हो। कृपया दिखाएं कि आप इस अवांछित व्यवहार को कैसे देख रहे हैं।
 – 
Borodin
22 अगस्त 2018, 18:10

2 जवाब

किसी दस्तावेज़ को पार्स करते समय, libxml2 जानकारी खो देता है कि दशमलव या हेक्स में एक संख्यात्मक वर्ण संदर्भ प्रदान किया गया था या नहीं। किसी भी समझदार आवेदन के लिए, इससे कोई फर्क नहीं पड़ता कि कौन सा प्रतिनिधित्व चुना गया है। लेकिन चूंकि हेक्साडेसिमल वर्ण संदर्भ विहित प्रतिनिधित्व होते हैं, आप कोशिश कर सकते हैं toStringC14N

print $doc->toStringC14N; # Will output &#xA;

ध्यान दें कि यह एक्सएमएल दस्तावेज़ के अन्य हिस्सों को भी सामान्य कर देगा, जो आपको चाहिए या नहीं भी हो सकता है। अन्य विहित विधियों और विकल्पों के लिए दस्तावेज़ीकरण भी देखें।

1
nwellnhof 30 अगस्त 2018, 17:46

स्ट्रिंग &#xA को XML में &amp;#xA के रूप में एन्कोड किया जाएगा। XML::LibXML इसे अपने आप एन्कोड कर देगा। एक्सएमएल को सीरियलाइज्ड स्ट्रिंग के रूप में प्रिंट करने से एन्कोडेड कैरेक्टर मिलेगा। डिकोड किए गए वर्ण को प्रिंट करने के लिए, getAttribute विधि का उपयोग करें।

use XML::LibXML;

my $doc = XML::LibXML::Document->new('1.0', 'utf-8');
my $string = '&#xA';
my $node = $doc->createElement('Element');
$node->setAttribute('attr', $string);

print $node->toString."\n"; # prints <Element attr="&amp;#xA"/>
print $node->getAttribute('attr')."\n"; # prints &#xA

ध्यान दें कि यदि आपकी स्ट्रिंग तत्व के टेक्स्ट सामग्री भाग में थी, तो आप इसके बजाय $node->textContent का उपयोग करेंगे।

0
beasy 22 अगस्त 2018, 23:36