1

您好,我正在尝试编写如下字符串:

 <xhtml:link rel="alternate" hreflang="de" href="http://www.example.com/de" />

使用XmlTextWriter

我试过这段代码:

// Write Alternative links _writer.WriteStartElement("xhtml:link"); _writer.WriteAttributeString("rel","alternate"); _writer.WriteAttributeString("hreflang", "de"); _writer.WriteAttributeString("href", "http://example.com/de"); _writer.WriteEndElement();

这会产生此错误: 未定义链接上的命名空间前缀 xhtml

但我不需要提供任何命名空间xhtml:link

问题:如何使用 XmlTextWriter 实现我需要的字符串?

更新 1:我已更改为 LINQ to XML

但是现在我还有另一个问题......首先我将展示代码:

    private readonly XNamespace nsXhtml = "http://www.w3.org/1999/xhtml";
    private readonly XNamespace nsSitemap = "http://www.sitemaps.org/schemas/sitemap/0.9";
    private readonly XNamespace nsXsi = "http://www.w3.org/2001/XMLSchema-instance";
    private readonly XNamespace nsLocation = "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd";

    public XDocument Generate()
    {
        var sitemap = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));

        var urlSet = new XElement(nsSitemap + "urlset",
            new XAttribute("xmlns", nsSitemap),
            new XAttribute(XNamespace.Xmlns + "xhtml", nsXhtml),
            new XAttribute(XNamespace.Xmlns + "xsi", nsXsi),
            new XAttribute(nsXsi + "schemaLocation", nsLocation),
            from node in GenerateUrlNodes() // Provides a collection of "objects", actually it doesn't matter since we anyway convert them to XElement below...
            select WriteUrlLocation(node.Url,node.UpdateFrequency,node.LastModified));

        sitemap.Add(urlSet);

        return sitemap;
    }

    protected XElement WriteUrlLocation(string url, UpdateFrequency updateFrequency, DateTime lastUpdated)
    {
        var urlNode = new XElement(nsSitemap + "url",
            new XElement(nsSitemap + "loc", url),
            new XElement(nsSitemap + "changefreq", updateFrequency),
            new XElement(nsSitemap + "lastmod", lastUpdated)
            );

        var linkNode = new XElement(nsXhtml + "link",
            new XAttribute("rel", "alternate"),
            new XAttribute("hreflang", "de"),
            new XAttribute("href", "http://example.com/de"));

        urlNode.Add(linkNode);
        return urlNode;
    }

问题是当我在控制器检查生成的站点地图时:

    public ActionResult Sitemap()
    {
        var sitemap = _sitemapGenerator.Generate().ToString();
        return Content(sitemap,"text/xml");
    }

整个 xml 不符合预期,并且该<xhtml:link>元素使用非空结束标记呈现(因此我不知道这是否是一个问题).. 请看图片

在此处输入图像描述

更新 2:已解决!似乎 XML 结构是有效的,但浏览器没有正确显示它......

4

2 回答 2

4

您应该更改为使用不同的重载XmlWriter.StartElement. 例如:

_writer.WriteStartElement("link", "http://www.w3.org/1999/xhtml");

这假设您已经获得了xhtmlnamespace的前缀别名http://www.w3.org/1999/xhtml。我仍然建议您尽快转换为使用 LINQ to XML……XmlWriter这对于您确实需要流式传输数据的情况(例如,当它很大时)非常有用,但除此之外,LINQ to XML 使事情变得更容易:

XNamespace xhtml = "http://www.w3.org/1999/xhtml";
var element = new XElement(xhtml + "link",
     new XAttribute("rel", "alternate"),
     new XAttribute("hreflang", "de"),
     new XAttribute("href", "http://example.com/de"));
parent.Add(element);
于 2014-08-04T12:34:46.903 回答
0

如果您将使用 XML Writer 并编写此

<xhtml:link rel="alternate" hreflang="en" href="www.yoursite.com" /> 

您可以为 .NET CORE 2.0 选择此代码:

foreach (SitemapNodeAlternate a in alternate)
{             
    MyWriter.WriteStartElement("xhtml", "link", null);
    MyWriter.WriteAttributeString("rel", "alternate");
    MyWriter.WriteAttributeString("href", a.href);
    MyWriter.WriteAttributeString("hreflang", a.hreflang);               
    MyWriter.WriteEndElement();
}
于 2018-03-10T17:05:50.080 回答