0

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

<%@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())));                                

        }

コード スニペットを確認し、問題を解決する方法を提案してください。

4

4 に答える 4

5

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

また、テンプレートに Dreamweaver TBB がある場合は、すべてがエンコードされた「出力」アイテムが作成されることに注意してください (ContentType を HTML にする Nuno の回答に沿って)。

単純にデコードして戻します。エンコードを解除する必要のない文字 (パーセント記号など) をエンコード解除することについて心配する必要はありません。これらの文字は二重にエンコードされるためです。

使用できる C# フラグメント TBB は次のとおりです。

<%@ 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);
于 2012-05-06T19:40:04.827 に答える
2

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

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

于 2012-05-06T18:26:24.457 に答える
1
var a = HttpUtility.HtmlDecode(XmlizedString);

特殊文字のエンコードを回避しました。問題を解決しました。

于 2012-05-07T09:06:53.110 に答える
0

「<」、「>」、「&」文字をエンコードせずに xml を書き込もうとしている場合は、WriteRaw() メソッドを使用できます。

例えば

  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();
于 2012-11-13T00:09:59.130 に答える