2017-09-06 32 views
0

XMLサイトマップを生成する既存のコードにXSLファイル参照を追加しようとしています。実際の物理XMLファイルはありません。コードでは、URLリライトパス(ハンドラはSitemapProvider.ashxと呼ばれ、sitemap.xmlへのリクエストを処理します)に応答するジェネリックハンドラを使用してXML応答を作成します。私の最終目標は、退屈なsitemap.xmlを最終的にスタイルして飾ることです。C#で動的に生成されたXMLにxml-stylesheetを追加する

ここに私のコードの抜粋です:

 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 

私が仕事をしたり、私が()makeXMLでコメントアウト1つ)ShowXML中のいずれかのコード(ように見えることはできません。

私は間違っていますか? (以前の挿入処理命令など)を文書内の任意のノードを消去することになるので、このアプローチは機能することができない文

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

LoadXmlの順序

+0

あなたは 'XmlDocument'を使う必要があるのでしょうか?あなたが望むXMLで文字列を生成し、それを直接レスポンスに書くのは簡単ではないでしょうか? – erdomke

+0

主に一貫性と検証のためです。私はまだC#を学んでいますが、これは言語を使った10週目です。 xmlが無効になるようなものを逃した場合、例外がスローされ出力されないので、学習プロセスに役立ちます。 –

答えて

1

。文字列連結を使用してXMLを構築する場合は、最初にそれを使用することにしてからPrependChildという処理命令を使用することをお勧めします。XMLDocumentCreate...のようなXML固有のAPIを一貫して使用するか、またはXmlWriter XMLを構築するためにLINQ to XMLに数日を要します。

+0

それは理にかなっています。私は注文を入れ替えて 'PrependChild'を使い、それは期待どおりに動作します。 XSLファイルをロードしたときと同じです。今は私のタイトルテンプレートを読み込んでいて、リンクを解析していないので、そのファイルを処理する必要があります。 –

関連する問題