【问题标题】:How to add custom xml tags to sitemap.xml using mvcsitemapprovider?如何使用 mvcsitemapprovider 将自定义 xml 标签添加到 sitemap.xml?
【发布时间】:2017-12-30 01:05:57
【问题描述】:

根据谷歌在Video sitemaps中的定义,有一些xml标签应该添加到视频的站点地图中,应该是这样的:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
 <loc>http://www.example.com/videos/some_video_landing_page.html</loc>
 <video:video>
   <video:thumbnail_loc>http://www.example.com/thumbs/123.jpg</video:thumbnail_loc>
   <video:title>Grilling steaks for summer</video:title>
   <video:description>Alkis shows you how to get perfectly done steaks every
     time</video:description>
   <video:content_loc>http://www.example.com/video123.mp4</video:content_loc>
   <video:player_loc autoplay="ap=1">
     http://www.example.com/videoplayer.mp4?video=123</video:player_loc>
   <video:duration>600</video:duration>
   <video:expiration_date>2009-11-05T19:20:30+08:00</video:expiration_date>
   <video:rating>4.2</video:rating>
   <video:view_count>12345</video:view_count>
   <video:publication_date>2007-11-05T19:20:30+08:00</video:publication_date>
   <video:family_friendly>yes</video:family_friendly>
   <video:restriction relationship="allow">IE GB US CA</video:restriction>
   <video:gallery_loc title="Cooking Videos">http://cooking.example.com</video:gallery_loc>
   <video:price currency="EUR">1.99</video:price>
   <video:requires_subscription>yes</video:requires_subscription>
   <video:uploader info="http://www.example.com/users/grillymcgrillerson">GrillyMcGrillerson
     </video:uploader>
   <video:live>no</video:live>
 </video:video>

我想知道如何将这些自定义标签动态添加到我的 sitemap.xml?我使用的是mvcsitemapprovider

【问题讨论】:

    标签: mvcsitemapprovider sitemapprovider xml-sitemap asp.net-mvc-sitemap


    【解决方案1】:

    由于 XML 站点地图功能不是 MvcSiteMapProvider 的主要用途,而是一个“额外”功能,因此它不是很灵活。

    我开始致力于创建一种通用的方式来构建(和页面)XML 站点地图并支持 Google 的完整规范(包括视频)。但是意识到这应该是一个完全独立于 MvcSiteMapProvider 的组件,并且从未发布它。欢迎您从here获取您需要的东西。

    【讨论】:

    • 感谢回复,参考google的说法,视频站点地图可以嵌入到我们的主sitemap.xml中,也可以是单独的xml文件,所以我需要的是能够设置自定义属性在我的动态节点提供者类中,就像设置 DynamicNode.Title 一样,希望你发布它,因为它会很有帮助
    【解决方案2】:

    好吧,我还不能使用 mvcsitemapprovider 来实现我的目标,但是我做了这个临时解决方案,我正在尝试从中制作 nuget 包或将其作为功能添加到 mvcsitemapprovider 包中,这是我添加的代码到控制器中的 ContentResult ,当 url 看起来像这样“/videoSiteMap.xml”时,我将我的 routeConfig 更改为调用此方法:

    public ContentResult VideoSiteMap()
        {
            XmlDocument xmlDoc = new XmlDocument();
            using (XmlWriter writer = xmlDoc.CreateNavigator().AppendChild())
            {
                //writer.Formatting = Formatting.Indented;
                writer.WriteStartDocument();
                writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");
    
                // add namespaces
                writer.WriteAttributeString("xmlns", "video", null, "http://www.google.com/schemas/sitemap-video/1.1");
                List<VideoSiteMap> siteMapp = null;
                siteMapp = ServiceHelper.GetGoogleSiteMap();//I invoked a service
                //you can use a fake loop instead: for (int i = 0; i < 10; i++)
                foreach( var content in siteMapp)
                {
                    writer.WriteStartElement("url");
    
                    // required
                    writer.WriteElementString("loc", "http://example.com/myplayer.aspx");
                    writer.WriteStartElement("video", "video", null);
    
                    // start:optional
                    writer.WriteElementString("video", "thumbnail_loc", null, "http://www.example.com/thumbs/123.jpg");
                    writer.WriteElementString("video", "title", null, "");
                    writer.WriteElementString("video", "description", null, "Alkis shows you how to get perfectly done steaks every time");
                    writer.WriteElementString("video", "content_loc", null, "http://www.example.com/video123.mp4");
    
                    writer.WriteStartElement("video", "player_loc", null);
                    writer.WriteAttributeString("autoplay", "ap=1");
                    writer.WriteString("http://www.example.com/videoplayer.mp4?video=123");
                    writer.WriteEndElement(); // video:player_loc
                                              // end:optional
    
                    writer.WriteElementString("video", "duration", null, "100");
                    writer.WriteElementString("video", "expiration_date", null, "2009-11-05T19:20:30+08:00");
                    writer.WriteElementString("video", "rating", null, "4.2");
                    writer.WriteElementString("video", "view_count", null, "12345");
                    writer.WriteElementString("video", "publication_date", null, "2007-11-05T19:20:30+08:00");
                    writer.WriteElementString("video", "family_friendly", null, "yes");
                    writer.WriteElementString("video", "category", null, "Cooking");
    
                    writer.WriteStartElement("video", "restriction", null);
                    writer.WriteAttributeString("relationship", "allow");
                    writer.WriteString("IE GB US CA");
                    writer.WriteEndElement();
    
                    writer.WriteStartElement("video", "gallery_loc", null);
                    writer.WriteAttributeString("title", "Cooking Videos");
                    writer.WriteString("http://cooking.example.com");
                    writer.WriteEndElement();
    
                    writer.WriteStartElement("video", "price", null);
                    writer.WriteAttributeString("currency", "EUR");
                    writer.WriteString("1.99");
                    writer.WriteEndElement();
    
                    writer.WriteElementString("video", "requires_subscription", null, "yes");
    
                    writer.WriteStartElement("video", "uploader", null);
                    writer.WriteAttributeString("info", "http://www.example.com/users/grillymcgrillerson");
                    writer.WriteString("GrillyMcGrillerson");
                    writer.WriteEndElement();
    
                    writer.WriteElementString("video", "live", null, "No");
    
                    writer.WriteEndElement(); // video:video
                    writer.WriteEndElement(); //url
                }
    
                writer.WriteEndElement(); //urlset 
                writer.WriteEndDocument();
                writer.Close();
            }
    
            var stringWriter = new StringWriter();
            var xmlTextWriter = XmlWriter.Create(stringWriter);
            xmlDoc.WriteTo(xmlTextWriter);
            xmlTextWriter.Flush();
            return Content(stringWriter.GetStringBuilder().ToString().replace("utf-16","utf-8"), "text/xml", Encoding.UTF8);
    
        }
    

    我在返回我的 xml 数据时将 utf-16 替换为 utf-8,因为我找不到更简单的方法来更改 XmlWriter 的结果(默认情况下它总是返回 utf-16 格式)

    我希望它可以帮助其他人,如果有人帮我把它做成一个 nuget 包或其他东西,我会很高兴:D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2016-05-19
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多