2010-11-22 11 views
6

मैं एक तरह से वास्तव में दांतेदार रूप में एक XML स्ट्रिंग रास्ता दृश्य स्टूडियो अपने ऑटो के साथ यह होता है कि फ़ॉर्मेट करने के लिए नेट की XmlWriter और संबद्ध XmlWriterSettings का उपयोग नहीं कर पाया है प्रारूप कमांड (Ctrl-E Ctrl-D, या, कीबोर्ड मैपिंग के आधार पर, Ctrl-K Ctrl-D)।प्रोग्राम प्रारूप एक्सएमएल

मैं क्योंकि ऐसा करने के लिए करना चाहते हैं मैं आदतन ऑटो प्रारूप वी.एस. में अपने सभी फाइलें, दोनों कोड और .Config फ़ाइलों। मेरे पास एक इंस्टॉलर ऐप है जो अद्यतन .config फ़ाइलों को अद्यतन करता है, और मैं पूरे दस्तावेज़ के बदले वास्तविक अंतर देखना चाहता हूं।

मैंने ऑटो-प्रारूप के लिए सभी अलग-अलग स्वरूपण विकल्पों की खोज नहीं की है, लेकिन मुझे प्रत्येक एक्सएमएल विशेषता को एक अलग पंक्ति पर होना पसंद है, पहले के समान लाइन के समान लाइन के साथ और बाद वाले लोगों के साथ पहले, इस तरह:

<asset assetId="12345" 
     bucket="default" 
     owner="nobody"> 
    <file path="\\localhost\share\assetA.mov"/> 
    <metadata metadataId="23456" 
      key="asset_type" 
      value="video"/> 
</asset> 

मैं के साथ प्रारूपित की कोशिश की है XmlWriterSettings गुण 'NewLineHandling = NewLineHandling.None' और 'NewLineOnAttributes = सच', लेकिन वह खुलने वाला टैग नीचे पहली विशेषता डालता है और सभी विशेषताओं के एक ही है तत्व नाम में वर्णों की # की परवाह किए बिना खरोज, इस तरह:

<asset 
    assetId="12345" 
    bucket="default" 
    owner="nobody"> 
    <file 
    path="\\localhost\share\assetA.mov" /> 
    <metadata metadataId="23456" 
    key="asset_type" 
    value="video" /> 
</asset> 

सूचना है कि मानक XmlWriter भी "/>" (अतिरिक्त स्लैश से पहले अंतरिक्ष) के साथ विशेषता-केवल तत्व है, जो मैं पसंद नहीं लेकिन यकीन नहीं है कि अगर XML मानक है समाप्त होता है। मुझे लगता है कि विजुअल स्टूडियो डेवलपर्स के लिए आसानी से उपलब्ध एक ही एपीआई विकल्प का उपयोग करता है, लेकिन मुझे अभी तक उन जादुई सेटिंग्स को नहीं मिला है। वैसे भी, यहां मेरी प्रारूप विधि है:

public static string FormatXml(string xmlString, bool indented) 
{ 
    using (TextReader textReader = new StringReader(xmlString)) 
    using (XmlReader xmlReader = new XmlTextReader(textReader)) 
    { 
     using (TextWriter textWriter = new StringWriter()) 
     { 
      var settings = new XmlWriterSettings(); 
      if (indented) 
      { 
       settings.Indent = true; 
       settings.IndentChars = " "; 
       settings.NewLineOnAttributes = true; 
       settings.NewLineHandling = NewLineHandling.None; 
      } 
      using (var xmlWriter = XmlWriter.Create(textWriter, settings)) 
      { 
       while (xmlReader.Read()) 
        xmlWriter.WriteNode(xmlReader, false); 
      } 
      return textWriter.ToString(); 
     } 
    } 
} 
+1

यह वहाँ नहीं है। उदाहरण के लिए –

उत्तर

1

मैंने इस सवाल को गलत समझा था। असल में मुझे नहीं पता कि आपके द्वारा दिखाए गए गुणों में गुणों को संरेखित करने का कोई तरीका है या नहीं। तुम्हें पता है, यह अपने आप को लागू करने के लिए कोशिश कर सकते कुछ इस तरह:

public static string FormatXml(string xmlString, bool indented) 
    { 
     using (TextReader textReader = new StringReader(xmlString)) 
     using (XmlReader xmlReader = new XmlTextReader(textReader)) 
     { 
      using (TextWriter textWriter = new StringWriter()) 
      { 
       string indent = ""; 
       string attributeIndent = ""; 

       while (xmlReader.Read()) 
       { 
        if (xmlReader.NodeType == XmlNodeType.Element) 
        { 
         attributeIndent = ""; 
         string element = xmlReader.Name; 
         textWriter.Write("{0}<{1}", indent, element); 

         if (!xmlReader.HasAttributes) 
          textWriter.WriteLine(">"); 
         else 
         { 
          int actual = 1; 
          while (xmlReader.MoveToNextAttribute()) 
          { 
           string content = String.Format("{0} {1}={2}", attributeIndent, xmlReader.Name, xmlReader.Value); 
           if (actual != xmlReader.AttributeCount) 
            textWriter.WriteLine(content); 
           else 
            textWriter.Write(content); 

           if (string.IsNullOrEmpty(attributeIndent)) 
            attributeIndent = indent + Enumerable.Repeat<string>(" ", element.Length + 1).Aggregate((a, b) => a + b); 

           actual++; 
          } 
          xmlReader.MoveToElement(); 
          textWriter.WriteLine(">"); 
          attributeIndent = ""; 
         } 
         if (!xmlReader.IsEmptyElement) 
         { 
          indent += " "; 
          textWriter.WriteLine(">"); 
         } 
         else 
          textWriter.WriteLine("/>"); 
        } 
        else if (xmlReader.NodeType == XmlNodeType.EndElement) 
        { 
         indent = indent.Substring(0, indent.Length - 2); 
         textWriter.WriteLine("{0}</{1}>", indent, xmlReader.Name); 
        } 
        else if (xmlReader.NodeType == XmlNodeType.Text) 
        { 
         textWriter.WriteLine(xmlReader.Value); 
        } 
       } 

       return textWriter.ToString(); 
      } 
     } 
    } 
+0

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

+0

ठीक है, वास्तव में मुझे नहीं पता कि कुछ है या नहीं; गुगल मुझे कुछ भी नहीं मिला है। मुझे उम्मीद है कि मैंने जो पोस्ट किया है वह आपकी मदद कर सकता है। –

0

जवाब यहाँ देखें: Is there a stylesheet or Windows commandline tool for controllable XML formatting, specifically putting attributes one-per-line?

यह काफी करीब है, लेकिन एक ही नज़र में प्राथमिक अंतर यह है कि पहले विशेषता एक नई लाइन पर है, जबकि विजुअल स्टूडियो में यह तत्व नाम के समान रेखा पर रहता है।

0

मुझे लगता है कि उद्धरण अवैध एक्सएमएल, जो रीडर/राइटर कुछ नाराज़गी दे सकते हैं। इसके अलावा, आप व्हाइटस्पेस को अनदेखा करने के लिए अपने diff एप्लिकेशन को क्यों नहीं बताते?

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