在C#中将xml-stylesheet添加到动态生成的XML中

时间:2017-09-06 22:18:57

标签: c# xml xslt

我正在尝试向现有代码添加XSL文件引用,以便动态生成XML站点地图。没有实际的物理XML文件,因为代码通过响应url重写路径的通用处理程序创建XML响应(处理程序称为SitemapProvider.ashx并处理对sitemap.xml的请求)。我的最终目标是最终设计和装饰枯燥的sitemap.xml。

以下是我的代码片段:

        public void ProcessRequest(HttpContext context)
    {

        XmlDocument doc = ShowXML(context);
        context.Response.ContentType = "text/xml";
        context.Response.ContentEncoding = System.Text.Encoding.UTF8;

        context.Response.Expires = -1;
        context.Response.Cache.SetAllowResponseInBrowserHistory(true);

        doc.Save(context.Response.Output);
    }

    private XmlDocument ShowXML(HttpContext context)
    {
        XmlDocument doc = new XmlDocument();
        var useXSL = doc.CreateProcessingInstruction(
            "xml-stylesheet", "type=\"text/xsl\" href=\"~/sitemap.xsl\""
            );
        doc.AppendChild(useXSL);
        doc.LoadXml(makeXML());

        return doc;
    }

    private string makeXML()
    {
        string xmlString = "";

        xmlString +=
            //"<?xml-stylesheet type=\"text/xsl\" href=\"/sitemap.xsl\"?>" +
            "<urlset xmlns = \"http://www.sitemaps.org/schemas/sitemap/0.9\">" +
            // and so it goes

我似乎无法使用ShowXML()中的代码或者我在makeXML()中注释掉的代码。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

使用陈述的顺序

   doc.AppendChild(useXSL);
    doc.LoadXml(makeXML());

LoadXml将删除文档中的任何节点(如之前插入的处理指令),以便该方法无法正常工作。如果你想使用字符串连接构造XML,那么你首先要使用它,然后使用PrependChild处理指令,我宁愿建议使用像XMLDocument {{1这样的单一XML特定API。一致的工厂方法或切换到Create...或这些天到LINQ to XML来构造XML。