2012-05-06 6 views
0

私は、コンポーネントソースからの入力をXmlElementとして入力し、簡単なトラバーシングのためにXPathDocumentに変換するC#TBBを記述しています。そして、取り出したコンテンツをXmlWriterを使用してメモリストリームに書き込みます。最後に出力XmlDocumentにプッシュしています。 &lt;&gt;のようなエンコードされた書式で、xmlドキュメントの出力は<>のように表示されます。これらの文字のエンコードを防止するにはどうすればよいですか?C#TBBのxml文書にある文字< >のエンコードを防止するにはどうすればよいですか?

<%@Import NameSpace="System.IO"%> 
<%@Import Namespace="System.Xml.XPath"%> 
<%@Import nameSpace="Tridion.ContentManager.CommunicationManagement"%> 
using (MemoryStream ms = new MemoryStream()) 

     {    

      TemplatingLogger log = TemplatingLogger.GetLogger(typeof(test)); 
      XmlTextWriter securboxXmlWriter = new XmlTextWriter(ms, new System.Text.UTF8Encoding(true)); 
      securboxXmlWriter.Indentation = 4; 
      securboxXmlWriter.Formatting = Formatting.Indented; 
      securboxXmlWriter.WriteStartDocument(); 
      securboxXmlWriter.WriteStartElement("comp");     
      securboxXmlWriter.WriteAttributeString("xmlns", "http://www.w3.org/1999/xhtml"); 
      securboxXmlWriter.WriteStartElement("con"); 
      securboxXmlWriter.WriteStartElement("wf:wf"); 
      securboxXmlWriter.WriteStartElement("wf:sI");     

      Component component=null; 
      string componentId = string.Empty; 
      try 
      { 
       component = engine.GetObject(package.GetByName(Package.ComponentName)) as Component; 
       log.Debug("componentId:"+component.Id); 
      } 
      catch (Exception e) 
      { 
       throw new InvalidOperationException("Component not found:" + e); 
      } 
     XmlElement componentxml = component.Content; // - this will give the xml Source of the component. 
     XmlDocument compXMLDoc = new XmlDocument();//- Creating the xml document 

     StringBuilder xmlTextBuilder = new StringBuilder(); 
     XmlWriter xmlWriter = new XmlTextWriter(new StringWriter(xmlTextBuilder)); 
     componentxml.WriteTo(xmlWriter);    
     compXMLDoc.Load(new StringReader(xmlTextBuilder.ToString())); 

     MemoryStream memStream = new MemoryStream(); 
     compXMLDoc.Save(memStream); 
     memStream.Position = 0; 
     XPathDocument xpathDoc = new XPathDocument(memStream);//creating xpath document    
     String groupBodyComponent = String.Empty; 
     String gBCValue = String.Empty; 
     XPathNavigator nav = xpathDoc.CreateNavigator(); 
     String value = string.Empty; 
     test t = new test(); 
     // move to first element 
     nav.MoveToFirstChild(); 
     nav.MoveToFirstChild();    
      //begin looping through the nodes 
     do 
     { 

      if (nav.Name.Equals("aH")) 
      {      
       securboxXmlWriter.WriteStartElement("wg:" + nav.Name); 
       if (nav.MoveToFirstChild()) 
       { 
        gBC = nav.InnerXml;       
        switch(gBC){ 
         case "bPTt": 
          while (nav.MoveToNext()) 
          { 
           log.Debug(nav.Name); 
           if (nav.Name.Equals("value")) 
           { 
            gBCValue = nav.InnerXml; 
           }          
           securboxXmlWriter.WriteStartElement("wg:" + gBC); 
           value = t.replaceDynamicVariable(gBCValue);//will have some html tags in it 
           securboxXmlWriter.WriteElementString("text", value); 
           securboxXmlWriter.WriteEndElement(); 
          } 
          break; 
        } 
        } 
       value = t.replaceDynamicVariable(nav.InnerXml); 
       securboxXmlWriter.WriteElementString("text", value);      
       securboxXmlWriter.WriteEndElement(); 
      } 
      } while (nav.MoveToNext()); 


      securboxXmlWriter.WriteEndElement(); 
      securboxXmlWriter.WriteEndElement(); 
      securboxXmlWriter.WriteEndElement(); 
      securboxXmlWriter.WriteEndElement(); 
      securboxXmlWriter.WriteEndDocument();     
      securboxXmlWriter.Flush(); 
      securboxXmlWriter.Close(); 
      Item output = package.GetByName("Output");    
      if (output != null) 
      { 
       package.Remove(output); 
      } 

      package.PushItem("Output", package.CreateStringItem(ContentType.Xml, Encoding.UTF8.GetString(ms.ToArray())));         

     } 

問題を解決する方法を提案してください。

+1

コードスニペットを単語で説明する代わりに入力してください。問題を引き起こしているコードを見れば、より簡単に手助けすることができます。 –

+0

var a = HttpUtility.HtmlDecode(XmlizedString); 問題を解決しました。ありがとうございました。 –

答えて

5

テンプレートの最後のTBBとして配置する必要がある別のTBBを使用して、すべてを単純にデコードすることができます。

Dreamweaver TBBテンプレートをお持ちの場合は、エンコードされたすべてのアイテム(「ヌーノ」の答えがインラインでContentTypeがHTMLになります)を含む「出力」アイテムが作成されます。

単にデコードし直してください。エンコードされていない文字(パーセント記号など)は、二重にエンコードされるので、エンコードを解除することは心配しないでください。変換すると、元に戻すことができます。ここで

は、あなたが使用することができますC#フラグメントTBBです:

特殊文字のエンコーディングを回避
2

このコンテンツをパッケージにプッシュしていますか?はいの場合は、package.CreateStringItemメソッドの異なるContentTypeオプションを使用して遊んでください。

コンテンツタイプのうちの1つは、HTMLまたはテキストのいずれかの特殊文字をそのまま維持しますが、現時点では100%確かではありません。

+0

これはContentType.Htmlで、Pacakge.CreateHtmlItemを使用して作成することもできます。 –

+0

あなたのお返事ありがとうございました。コンテンツをパッケージにプッシュするための文をPFBで指定します。しかし、私はソースセクションのエンコードされた文字とプレビューパートのタグを取得しています。 "この問題を解決する方法を私に教えてください。" "package.PushItem(" Output "、package.CreateStringItem(ContentType.Html、Encoding.UTF8.GetString(ms.ToArray())));前もって感謝します。 –

+1

あなたはまだContentType.HTMLを使用しているようです。代わりにContentType.Textを使用してみてください: package.PushItem( "Output"、package.CreateStringItem(ContentType.text、Encoding.UTF8.GetString(ms.ToArray())))); –

1
var a = HttpUtility.HtmlDecode(XmlizedString); 

<%@ Import Namespace="System.Web"%> 

Item outputItem = package.GetByName("Output"); 
string outputText = outputItem.GetAsString(); 
outputText = HttpUtility.HtmlDecode(outputText); 
outputItem.SetAsString(outputText); 
package.Remove(outputItem); 
package.PushItem("Output", outputItem); 
。 問題を解決しました。

0

それはあなたがWriteRaw()メソッドを使用することができます「<」、「>」、「&」文字をコードするなく、XML を作成しようとしています。

var xmlFile = "C:\Temp\Test.xml"; 
    var xmlstring = "<Nodes><Node>1</Node><Node>2</Node>><Node>3</Node></Nodes>"; 
    XmlTextWriter writer; 
    writer = new XmlTextWriter(xmlFile, Encoding.UTF8); 
    writer.WriteRaw(xmlstring); 
    writer.Flush(); 
    writer.Close(); 
関連する問題