我正在尝试向现有代码添加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()中注释掉的代码。
我做错了什么?
答案 0 :(得分:1)
使用陈述的顺序
doc.AppendChild(useXSL);
doc.LoadXml(makeXML());
LoadXml
将删除文档中的任何节点(如之前插入的处理指令),以便该方法无法正常工作。如果你想使用字符串连接构造XML,那么你首先要使用它,然后使用PrependChild
处理指令,我宁愿建议使用像XMLDocument
{{1这样的单一XML特定API。一致的工厂方法或切换到Create...
或这些天到LINQ to XML来构造XML。