2012-07-13 15 views
6

में पंक्ति विराम पर ध्यान नहीं देता इस सवाल के अनुसार:LINQ विशेषताओं

Are line breaks in XML attribute values allowed?

लाइन XML गुणधर्मों में टूट जाता है पूरी तरह से वैध है (हालांकि शायद अनुशंसित नहीं) कर रहे हैं:

<xmltag1> 
    <xmltag2 attrib="line 1 
line 2 
line 3"> 
    </xmltag2> 
</xmltag1> 

जब मैं पार्स LINQ से XML (System.Xml.Linq) का उपयोग कर ऐसा एक्सएमएल, उन लाइन ब्रेक को चुपचाप अंतरिक्ष ' ' वर्णों में परिवर्तित कर दिया जाता है।

क्या उन लाइन ब्रेक को संरक्षित करने के लिए XDocument.Load() पार्सर को बताने का कोई तरीका है?

पीएस .: एक्सएमएल मैं पार्सिंग तीसरे पक्ष के सॉफ्टवेयर द्वारा लिखा गया है, इसलिए मैं लाइन ब्रेक लिखने के तरीके को बदल नहीं सकता।

+0

यदि आप विशेषताएँ लिख रहे हैं तो इस आलेख को प्रोग्रामिक रूप से देखें, जो स्ट्रिंग से बचने के विभिन्न तरीकों को दिखाता है। Http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/ अलग-अलग-how-to-escape- एक-एक्सएमएल-स्ट्रिंग-इन-सीस्पैक्स ध्यान में रखता है कि न केवल लाइनब्रैक से बच जाना चाहिए। –

उत्तर

9

यदि आप विशेषता मानों में लाइन ब्रेक संरक्षित करना चाहते हैं तो आपको उन्हें चरित्र संदर्भों के साथ लिखना होगा।

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/> 

अन्य के रूप में बुद्धिमान XML पार्सर, रिक्त स्थान के लिए उन्हें सामान्य होगा XML विवरण http://www.w3.org/TR/xml/#AVNormalize के अनुसार।

[संपादित करें] आप तो विशेषता मान सामान्य से बचने के लिए एक विरासत के साथ एक्सएमएल लोड हो रहा है चाहते हैं XmlTextReader मदद करता है:

  string testXml = @"<foo bar=""Line 1. 
Line 2. 
Line 3.""/>"; 

      XDocument test; 
      using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml))) 
      { 
       xtr.Normalization = false; 
       test = XDocument.Load(xtr); 
      } 
      Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value); 

कि आउटपुट

|Line 1. 
Line 2. 
Line 3.| 
+0

धन्यवाद, लेकिन जैसा कि मैंने अपने प्रश्न में लिखा है, एक्सएमएल तीसरे पक्ष के सॉफ्टवेयर द्वारा लिखा गया है, इसलिए मैं इसे बदल नहीं सकता। शायद मुझे किसी प्रकार की रेगेक्स प्रतिस्थापन की आवश्यकता है जो लाइन ब्रेक को – cheeesus

+0

में परिवर्तित करता है मैंने आपके प्रश्न में यह नोट देखा लेकिन इस मामले में एक स्पष्ट विनिर्देश है और परिणाम आपको प्राप्त करने का अनुपालन कर रहा है। तो मैंने यह जवाब देने के लिए जवाब लिखा कि आपके द्वारा प्राप्त व्यवहार सही है, भले ही आपके मामले में नहीं चाहता था। मुझे लगता है कि एक विरासत 'XmlTextReader' हालांकि आपको विशेषता मान सामान्यीकरण से बचने की अनुमति देगा, इसलिए मैं इसे दिखाने के लिए अपना उत्तर संपादित कर दूंगा। –

+0

धन्यवाद! 'XmlTextReader' नौकरी – cheeesus

0

पंक्ति विराम रिक्त स्थान जब पार्स नहीं कर रहे हैं (ASCII कोड 32 नहीं) यदि आप प्रत्येक पत्र के माध्यम से कदम उठाते हैं तो आप देखेंगे कि "स्पेस" "एक ASCII कोड 10 = एलएफ (लाइनफिड) (!!) है - इसलिए लाइनब्रेक अभी भी मौजूद हैं यदि आपको प्रतिस्थापित करने की आवश्यकता है उन्हें आपके कोड में ASCII 13 के साथ ... (टेक्स्टबॉक्स (विंडोज़ रूपों) वामो एक LINEBREAK के रूप में नहीं दिखाया जा रहा)

+0

करता है धन्यवाद, मैंने पहले परीक्षण किया था, और मुझे वास्तव में दो ASCII कोड 32 वर्ण मिले हैं जहां लाइन ब्रेक होना चाहिए। मैं फिर से सुनिश्चित करने के लिए परीक्षण करने जा रहा हूँ। – cheeesus

+1

मैंने इसे फिर से परीक्षण किया। एक्सएमएल विशेषता में '' r'' और '\ n'' वर्ण दोनों '' '' रिक्त स्थान (ASCII कोड 32) में परिवर्तित हो जाते हैं। – cheeesus

+0

सही है - जो एक सीडीएटी सेक्शन पर लागू होता है - वर्तमान में लाइनब्रेक्स को संरक्षित करने के लिए कोई रास्ता नहीं मिल सका। 32 32 से एलबी का एक विकल्प आपके लिए एक विकल्प है? – Cadburry

0

MSDN के अनुसार:

एक्सएमएल प्रोसेसर तत्व सामग्री में सभी सफेद स्थान को संरक्षित हैं, वे अक्सर यह विशेषता मान में सामान्य बनाते हैं। टैब्स, कैरिज रिटर्न, और रिक्त स्थान एकल रिक्त स्थान के रूप में रिपोर्ट किए जाते हैं। कुछ प्रकार के गुणों में, वे सफेद स्थान को ट्रिम करते हैं जो मूल्य के मुख्य भाग से पहले या उसके बाद आता है और मूल्य के भीतर सफेद स्थान को एकल स्थान पर कम करता है। (यदि एक DTD उपलब्ध है, इस ट्रिमिंग सभी विशेषताओं है कि प्रकार CDATA के नहीं हैं पर प्रदर्शन किया जाएगा।)

उदाहरण के लिए, एक XML दस्तावेज निम्नलिखित शामिल हो सकता है:

<whiteSpaceLoss note1="this is a note." note2="this 
is 
a 
note."> 

एक XML पार्सर रिपोर्ट दोनों विशेषता मान "this is a note." के रूप में, लाइन ब्रेक को एकल रिक्त स्थान में परिवर्तित कर रहा है।

मैं विशेषताओं की व्हाइटस्पेस संरक्षण के बारे में कुछ भी नहीं मिल सकता है, लेकिन मुझे लगता है कि यह इस व्याख्या के अनुसार असंभव हो सकता है।