2010-03-30 30 views
8

Tôi có một hàm lấy 2 tham số: 1 = tệp XML, 2 = tệp XSLT, sau đó thực hiện phép chuyển đổi và trả về kết quả HTML.C# Làm thế nào để thực hiện một phép chuyển đổi xslt trực tiếp trên một đối tượng bộ nhớ?

Dưới đây là các chức năng:

/// <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(); 
} 

Tôi muốn thay đổi các chức năng không chấp nhận một tập tin cho XML, mà thay vào đó chỉ là một đối tượng. Đối tượng là chính xác tương thích với xslt, nếu nó được tuần tự hóa thành tệp. Nhưng tôi không muốn phải serialize nó vào một tập tin đầu tiên.

Vì vậy, để tóm tắt: giữ xslt đến từ một tập tin, nhưng đầu vào xml nên một đối tượng tôi vượt qua và muốn tạo xml mà không có bất kỳ tương tác hệ thống tập tin.

Trả lời

9

Bạn có thể tuần tự hóa đối tượng thành một chuỗi, tải chuỗi đó vào một XmlDocument và thực hiện chuyển đổi:

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

Tôi chỉ sử dụng điều này, nhưng phải chỉ ra rằng tôi cần thay đổi 'Position' thành' = 0' . Nếu không, nó hoạt động như mong đợi. =) – Dracorat

3

Đây là một chức năng sẽ biến một đối tượng thành một XDocument (bạn có thể thay đổi nó cho XmlDocument nếu bạn không sử dụng XDocument). Tất nhiên điều này sẽ ném ngoại lệ nếu đối tượng không phải là serializeable.

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); 
} 

và đây là một cho 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 cần XmlDocument chứ không phải XDocument ... Nếu không, điều này gần bằng với ý tưởng của tôi;) –

1

Không thử nghiệm, nhưng bạn có thể sử dụng XPathDocument để có một Stream, và kể từ XPathDocument thực hiện IXPathNavigable, nó có thể được sử dụng để biến đổi:

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

Hãy xem this article mô tả việc tạo một XPathNavigator có thể điều hướng các thuộc tính của biểu đồ đối tượng, một kết hợp khá mạnh mẽ của XPath và XSLT.

Các vấn đề liên quan