2010-03-30 6 views
8

मेरे पास एक ऐसा फ़ंक्शन है जो 2 पैरामीटर लेता है: 1 = एक्सएमएल फ़ाइल, 2 = एक्सएसएलटी फ़ाइल, फिर एक रूपांतरण करता है और परिणामस्वरूप एचटीएमएल देता है।सी # मेमोरी ऑब्जेक्ट पर लाइव xslt रूपांतरण कैसे करें?

/// <summary> 
/// Will apply an XSLT style to any XML file and return the rendered HTML. 
/// </summary> 
/// <param name="xmlFileName"> 
/// The file name of the XML document. 
/// </param> 
/// <param name="xslFileName"> 
/// The file name of the XSL document. 
/// </param> 
/// <returns> 
/// The rendered HTML. 
/// </returns> 
public string TransformXml(string xmlFileName, string xslFileName) 
{ 
    var xtr = new XmlTextReader(xmlFileName) 
        { 
         WhitespaceHandling = WhitespaceHandling.None 
        }; 
    var xd = new XmlDocument(); 
    xd.Load(xtr); 

    var xslt = new System.Xml.Xsl.XslCompiledTransform(); 
    xslt.Load(xslFileName); 
    var stm = new MemoryStream(); 
    xslt.Transform(xd, null, stm); 
    stm.Position = 1; 
    var sr = new StreamReader(stm); 
    xtr.Close(); 
    return sr.ReadToEnd(); 
} 

मैं एक्सएमएल के लिए एक फ़ाइल को स्वीकार नहीं समारोह को बदलना चाहते हैं, लेकिन इसके बजाय सिर्फ एक वस्तु:

यहाँ कार्य है। ऑब्जेक्ट xslt के साथ बिल्कुल संगत है, अगर इसे फ़ाइल में क्रमबद्ध किया गया था। लेकिन मैं इसे पहले फ़ाइल में क्रमबद्ध नहीं करना चाहता हूं।

तो पुन: संक्षेप में: xslt को फ़ाइल से आते रहें, लेकिन एक्सएमएल इनपुट को एक ऑब्जेक्ट चाहिए जो मैं पास करता हूं और बिना किसी फ़ाइल सिस्टम इंटरैक्शन के एक्सएमएल उत्पन्न करना चाहता हूं।

उत्तर

9

आप एक स्ट्रिंग के लिए वस्तु को क्रमानुसार, एक XmlDocument में स्ट्रिंग लोड कर सकते हैं, और परिवर्तन करते हैं:

public string TransformXml(object data, string xslFileName) 
{ 

    XmlSerializer xs = new XmlSerializer(data.GetType()); 
    string xmlString; 
    using (StringWriter swr = new StringWriter()) 
    { 
     xs.Serialize(swr, data); 
     xmlString = swr.ToString(); 
    } 

    var xd = new XmlDocument(); 
    xd.LoadXml(xmlString); 

    var xslt = new System.Xml.Xsl.XslCompiledTransform(); 
    xslt.Load(xslFileName); 
    var stm = new MemoryStream(); 
    xslt.Transform(xd, null, stm); 
    stm.Position = 0; 
    var sr = new StreamReader(stm); 
    return sr.ReadToEnd(); 
} 
+1

मैंने अभी इसका उपयोग किया है, लेकिन मुझे यह इंगित करना होगा कि मुझे 'स्थिति' को' = 0' में बदलने की आवश्यकता है । अन्यथा यह उम्मीद के रूप में काम किया। =) – Dracorat

3

यहां एक ऐसा फ़ंक्शन है जो किसी ऑब्जेक्ट को XDocument में बदल देगा (यदि आप अभी तक XDocument का उपयोग नहीं कर रहे हैं तो आप इसे XmlDocument के लिए बदल सकते हैं)। अगर ऑब्जेक्ट क्रमबद्ध नहीं है तो निश्चित रूप से यह अपवाद फेंक देगा।

public static XDocument ConvertToXml<T>(this T o) 
{ 
    StringBuilder builder = new StringBuilder(); 
    StringWriter writer = new StringWriter(builder); 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    serializer.Serialize(writer,o); 
    StringReader reader = new StringReader(builder.ToString()); 
    return XDocument.Load(reader); 
} 

और यहाँ XmlDocument के लिए एक

public static XmlDocument ConvertToXml<T>(this T o) 
{ 
    StringBuilder builder = new StringBuilder(); 
    StringWriter writer = new StringWriter(builder); 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    serializer.Serialize(writer,o); 
    StringReader reader = new StringReader(builder.ToString()); 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(reader); 
    return doc; 
} 
+0

XslCompiledTransform को XDDocument की आवश्यकता नहीं है, एक्सडी दस्तावेज नहीं है ... अन्यथा, यह लगभग मेरे विचार के समान ही है;) –

1

जांची नहीं है, लेकिन आप XPathDocument उपयोग कर सकते हैं एक स्ट्रीम लेने के लिए, और के बाद से XPathDocument लागू करता IXPathNavigable, यह परिवर्तनों के लिए इस्तेमाल किया जा सकता है:

public string TransformXml(Stream xmlFile, string xslFileName) 
{ 
     var doc = new XPathDocument(xmlFile); 
     var xslt = new System.Xml.Xsl.XslCompiledTransform(); 
     xslt.Load(xslFileName); 
     var stm = new MemoryStream(); 
     xslt.Transform(doc, null, stm); 
     stm.Position = 1; 
     var sr = new StreamReader(stm); 
     return sr.ReadToEnd(); 
    } 
0

this article पर एक नज़र जो एक XPathNavigator है कि एक वस्तु ग्राफ है, जो XPath और XSLT की एक बहुत शक्तिशाली संयोजन है के गुणों नेविगेट कर सकते हैं बनाने का वर्णन करता है।

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