2012-10-16 20 views
8

पर अधिकतम दो टैग के साथ xml लिखना मैं .NET के XElement से xml को सहेज रहा हूं। मैं विधि ToString का उपयोग कर रहा हूं, लेकिन स्वरूपण यह नहीं देखता कि मैं कैसा चाहता हूं (नीचे उदाहरण)। मुझे प्रति पंक्ति में अधिकतम दो टैग चाहिए। मैं उसे कैसे प्राप्त कर सकता हूं?प्रति पंक्ति


सहेजा जा रहा है XElement.Parse("<a><b><c>one</c><c>two</c></b><b>three<c>four</c><c>five</c></b></a>").ToString() मुझे

<a> 
    <b> 
    <c>one</c> 
    <c>two</c> 
    </b> 
    <b>three<c>four</c><c>five</c></b> 
</a> 

देता है लेकिन पठनीयता के लिए मैं करूंगा बल्कि 'तीन', 'चार' और 'पाँच' अलग पंक्ति में थे:

<a> 
    <b> 
    <c>one</c> 
    <c>two</c> 
    </b> 
    <b>three 
    <c>four</c> 
    <c>five</c> 
    </b> 
</a> 

संपादित करें: हाँ मैं समझता हूं कि यह वाक्य रचनात्मक रूप से अलग है और "xml की भावना में नहीं", लेकिन मैं व्यावहारिक हूं। हाल ही में मैंने मेगाबाइट-आकार की एक्सएमएल फाइलों को 3 लाइनों के साथ देखा है- ये टेक्स्ट एडिटर्स, स्रोत कंट्रोल और डिफ टूल्स के लिए चुनौतीपूर्ण हैं। कुछ करने की ज़रूरत है! मैंने परीक्षण किया है कि उपरोक्त स्वरूपण को बदलना हमारे आवेदन के अनुकूल है।

+2

+1 अस्पष्ट डाउनवॉट्स की क्षतिपूर्ति के लिए। हालांकि, यह एक्सएमएल के लिए नहीं है। यदि आप इसे सादे पाठ/मुक्त प्रारूप बनाना चाहते हैं, तो आप कुछ और उपयोग कर सकते हैं। 'xmllint --format' ऐसा करता है यदि आपको – sehe

+0

हाय सेहे पसंद है। एक्सएमलिंट एक लिनक्स प्रोग्राम है-क्या ऐसा कुछ भी है जो इसे .NET के लिए प्रारूपित कर सकता है? और आपका क्या मतलब है 'यह एक्सएमएल के लिए नहीं है'? –

+0

जब आप कहते हैं कि आप पठनीयता में सुधार करने की कोशिश कर रहे हैं, तो क्या यह केवल तब होगा जब आप (और संभवतः अन्य डेवलपर्स) को डिबगिंग उद्देश्यों के लिए फ़ाइल का निरीक्षण करना होगा? यदि ऐसा कुछ ऐसा होता है जो अक्सर फ़ाइल को कितनी बार सहेजा जाता है, इसके परिणामस्वरूप, पोस्ट-प्रोसेसिंग के माध्यम से परिणाम प्राप्त करना स्वीकार्य होगा या सभी फ़ाइलों को अतिरिक्त व्हाइटस्पेस से सहेजने की आवश्यकता है? – jerry

उत्तर

3

सहकर्मियों के समझाए गए कारण - हम फ़ाइल प्रारूप को बदलने जा रहे हैं। मैं आपको ऐसा करने की कोशिश करता हूं। जो कुछ मैं चाहता था वह करना असंभव है, क्योंकि अधिकांश एक्सएमएल उपकरण मानते हैं कि व्हाइटस्पेस महत्वपूर्ण है।

+3

मुद्दा यह है कि आपके पास मिश्रित सामग्री नोड है - यदि आप इससे छुटकारा पा सकते हैं तो इंडेंटिंग काम करेगी। प्रारूप बदलने से पहले देखें कि क्या आपके स्वयं के XmlWriter को कार्यान्वित करना है जो हमेशा नई लाइन पर तत्व डालता है, आपके लिए समस्याओं को हल कर सकता है। –

2

एक्सएमएल कंप्यूटर के लिए लक्षित एक सूचना विनिमय प्रारूप है। व्हाइटस्पेस अप्रासंगिक है (वास्तव में स्थान और स्कीमा के आधार पर) और इस तरह, यह एक या दूसरे का उपयोग करने के लिए मनमाना होगा।

आप XElement.Save साथ XmlTextWriter का उपयोग करें और देखें कि क्या आपको XmlWriter.Settings Property

+0

यह गलत है कि उसका प्रश्न डब्लूआरटी है - व्हाइटस्पेस के हर बाइट को दिखाया गया है, भले ही हमें नहीं लगता कि यह एप्लिकेशन स्तर पर है। –

+1

@ जेसनवियर सभी उचित सम्मान के साथ, ओपी द्वारा निर्दिष्ट संदर्भ linq-to-xml है। दिए गए नमूने में व्हाइटस्पेस महत्वपूर्ण नहीं है। वह बस इसे बहुत मुद्रित चाहता है। यह एक प्रेजेंटेशन चीज है और linq-to-xml सीधे इसका समर्थन नहीं करता है। वह एक कस्टम XmlWriter का उपयोग कर सकता है, हालांकि – sehe

+1

आपका कथन सही है, लेकिन हम विभिन्न संदर्भों का जिक्र कर रहे हैं। आवेदन स्तर पर, जहां तक ​​linq-to-xml का संबंध है, ऐसा नहीं लगता कि व्हाइटस्पेस महत्वपूर्ण है। एक्सएमएल सीरिएलाइज़र नहीं जानता कि linq-to-xml में वह भेद (या इसकी कमी है)। यह केवल एक्सएमएल स्पेक के बारे में जानता है, और spec के अनुसार, उनके उदाहरण एक्सएमएल में सभी सफेद जगह महत्वपूर्ण है। –

3

के साथ अपने पसंद के हिसाब से यह ठीक कर सकते हैं जिस तरह से आप स्वरूपण नग्न "तीन" की वजह से चाहते हैं काम नहीं कर रहा हो सकता है। क्या इसका कोई कारण नहीं है कि यह अपने टैग में नहीं है? क्या यह इसके बजाय "बी" की विशेषता होनी चाहिए?

13

यदि आप वास्तव में उस आउटपुट चाहते हैं, तो आपको इसे आवश्यक रूप से नोड्स के चारों ओर व्हाइटस्पेस जोड़ने, मैन्युअल रूप से करने की आवश्यकता होगी।

एक्सएमएल दस्तावेज़ों में लगभग सभी सफेद जगह महत्वपूर्ण है, भले ही हम केवल इसे इंडेंटिंग के रूप में सोचें। जब हम धारावाहिक से हमारे लिए दस्तावेज़ को इंडेंट करने के लिए कहते हैं, तो यह उस सामग्री में परिवर्तन कर रहा है जो निकाला जा सकता है, इसलिए वे यथासंभव रूढ़िवादी होने की कोशिश करते हैं। तत्वों

<tag>foo</tag> 

और

<tag> 
    foo 
</tag> 

अलग सामग्री है, और अगर एक serializer बाद में पूर्व बदल गया है, यह है कि आप अपने XML API से वापस पाने के बदल जाएगा जब <tag> की सामग्री के लिए पूछ ।

अंगूठे का सामान्य नियम यह है कि तत्वों के बीच कोई मौजूदा गैर-व्हाइटस्पेस होने पर कोई इंडेंटिंग लागू नहीं की जाएगी। इस मामले में, टैग के बीच आपके three संशोधित किए जाएंगे यदि एक सीरिएलाइज़र आपके इच्छित इंडेंटिंग को लागू करता है, इसलिए आपके लिए कुछ भी स्वचालित रूप से नहीं होगा।


आप XML स्वरूप पर नियंत्रण है, तो यह के रूप में यह तुम क्या जैसे मुद्दों का कारण बनता है 'यह है, जहां <b> दोनों पाठ (three) और तत्व (<c>) बच्चों, है जैसे तत्व और पाठ बच्चों मिश्रण के लिए अनुचित है देख रहे हैं

0

मुझे पहले कुछ ऐसा करना पड़ा (क्लाइंट अनुरोध के लिए)। मैं बस एक कस्टम लिख रहा था। ToString() विधि केवल ब्राउज़र में एक्सएमएल प्रदर्शित करने के लिए उपयोग की जाती है (यूघ, मुझे पता है) या सामग्री के xml फ़ाइल को डाउनलोड करने में उनके उपयोग के लिए। चूंकि कोड को कम्प्यूटेशनल रूप से कुशल नहीं होना चाहिए था, इसलिए यह केवल प्रत्येक टैग के बच्चों की जांच करने और 'लटकाने' पाठ को व्यवस्थित करने की बात थी।

आखिरकार हम उपयोगकर्ता को यह समझाने में सक्षम थे कि पाठ इसके बजाय एक विशेषता होना चाहिए।

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