2013-09-26 3 views
0
public class HomeController : Controller 
{ 
    public ActionResult SitemapXML() 
    { 
     return new XmlSiteMapResult(); 
    } 
} 

Как создать карту сайта в кодировке utf-8 без спецификации?Получение «ï» ¿»в начале sitemap.xml по mvc поставщик Sitemap

+2

Почему проблема? Любой действительный читатель XML должен иметь возможность справиться с этим. –

+0

validation xml yandex.ru, find error – konstantin

+0

Похоже, что это сломано тогда ... или ваша кодировка ответа установлена ​​неправильно. Я предлагаю вам посмотреть * точно, какой ответ вы получаете, включая заголовки. –

ответ

0

Создайте класс, чтобы переопределить поведение XmlSiteMapResult по умолчанию, чтобы исключить спецификацию.

public class MyXmlSiteMapResult : XmlSiteMapResult 
{ 

    /// <summary> 
    /// Maximal number of links per sitemap file. 
    /// </summary> 
    /// <remarks> 
    /// This number should be 50000 in theory, see http://www.sitemaps.org/protocol.php#sitemapIndex_sitemap. 
    /// Since sitemap files can be maximal 10MB per file and calculating the total sitemap size would degrade performance, 
    /// an average cap of 35000 has been chosen. 
    /// </remarks> 
    private const int MaxNumberOfLinksPerFile = 35000; 

    protected override void ExecuteSitemapIndexResult(ControllerContext context, IEnumerable<SiteMapNode> flattenedHierarchy, long flattenedHierarchyCount) 
    { 
     // Count the number of pages 
     double numPages = Math.Ceiling((double)flattenedHierarchyCount/MaxNumberOfLinksPerFile); 

     // Output content type 
     context.HttpContext.Response.ContentType = "text/xml"; 

     // Generate sitemap sitemapindex 
     var sitemapIndex = new XElement(Ns + "sitemapindex"); 
     sitemapIndex.Add(GenerateSiteMapIndexElements(Convert.ToInt32(numPages), Url, SiteMapUrlTemplate).ToArray()); 

     // Generate sitemap 
     var xmlSiteMap = new XDocument(
      new XDeclaration("1.0", "utf-8", "true"), 
      sitemapIndex); 

     // Specify to emit XML with no BOM 
     var settings = new XmlWriterSettings(); 
     settings.Encoding = new System.Text.UTF8Encoding(false); 

     // Write XML 
     using (Stream outputStream = RetrieveOutputStream(context)) 
     { 
      using (var writer = XmlWriter.Create(outputStream, settings)) 
      { 
       xmlSiteMap.WriteTo(writer); 
      } 
      outputStream.Flush(); 
     } 
    } 

    protected override void ExecuteSitemapResult(ControllerContext context, IEnumerable<SiteMapNode> flattenedHierarchy, long flattenedHierarchyCount, int page) 
    { 

     // Output content type 
     context.HttpContext.Response.ContentType = "text/xml"; 

     // Generate URL set 
     var urlSet = new XElement(Ns + "urlset"); 
     urlSet.Add(GenerateUrlElements(
      flattenedHierarchy.Skip((page - 1)* MaxNumberOfLinksPerFile) 
       .Take(MaxNumberOfLinksPerFile), Url).ToArray()); 

     // Generate sitemap 
     var xmlSiteMap = new XDocument(
      new XDeclaration("1.0", "utf-8", "true"), 
      urlSet); 

     // Specify to emit XML with no BOM 
     var settings = new XmlWriterSettings(); 
     settings.Encoding = new System.Text.UTF8Encoding(false); 

     // Write XML 
     using (Stream outputStream = RetrieveOutputStream(context)) 
     { 
      using (var writer = XmlWriter.Create(outputStream, settings)) 
      { 
       xmlSiteMap.WriteTo(writer); 
      } 
      outputStream.Flush(); 
     } 
    } 
} 

И затем вместо этого верните свой собственный класс.

public class HomeController : Controller 
{ 
    public ActionResult SitemapXML() 
    { 
     return new MyXmlSiteMapResult(); 
    } 
} 

ПРИМЕЧАНИЕ: В этом примере предполагается, что вы используете версию 3 MvcSiteMapProvider, так как в v4, класс XmlSiteMapResult больше не имеет конструктор по умолчанию (в v4, вы должны использовать XmlSiteMapResultFactory, чтобы получить экземпляр XmlSiteMapResult так вам также необходимо переопределить XmlSiteMapResultFactory, чтобы вернуть экземпляр вашего пользовательского класса).

Код: How can I remove the BOM from XmlTextWriter using C#?