1

テンプレート (C#) を介してマルチメディア コンポーネントに埋め込まれた XML ファイル コンテンツを読み込もうとしています。XML ファイルには UTF-8 文字がほとんど含まれていません。XML コンテンツを読み取ると、出力で UTF-8 文字が一部の文字化け (? 記号または四角形のボックス) に変換されます。以下は、C# テンプレートで使用したコード スニペットです。

コード 1:

Component xmlMultimediaComponent = (Component)XMLMMSRepositoryObject;
// read xml in multimedia component into a string
UTF8Encoding encoding = new UTF8Encoding();
byte[] binary = xmlMultimediaComponent.BinaryContent.GetByteArray();
string navXmlContent = (binary != null) 
               ? UTF8Encoding.UTF8.GetString(binary, 0, binary.Length) 
                       : string.Empty;           

コード 2:

using (MemoryStream ms = new MemoryStream())
{
  xmlMultimediaComponent.BinaryContent.WriteToStream(ms);
  ms.Seek(0, SeekOrigin.Begin);

  using (var streamReader = new StreamReader(ms, Encoding.UTF8))
  {                      
    string output = streamReader.ReadToEnd();
      ....
  }
}

上記の両方のケースで、出力にガベージ文字が含まれています (UTF-8 エンコードの場合)。

Tridion マルチメディア コンポーネントの XML ファイルから、同じ UTF-8 コンテンツを文字列出力に取得する方法を教えてください。

注: マルチメディア コンポーネントの XML ファイルは、UTF-8 エンコードで保存されます。

前もって感謝します。

4

2 に答える 2

2

さらに調査したところ、マルチメディア コンポーネントに関連付けられているファイルが ASCII エンコードされていることがわかりました。そのため、コンテンツの読み取り中に UTF-8 への明示的な変換があってはならず、デフォルトのエンコーディング (つまり、上記の場合は ASCII) を使用する必要があります。

       Component xmlMultimediaComponent = XMLMMSRepositoryObject as Component;               
       byte[] binary = xmlMultimediaComponent.BinaryContent.GetByteArray();
       string navContent = (binary != null) ? Encoding.GetEncoding("ASCII") : string.Empty;
于 2013-01-31T18:43:23.767 に答える
2

なぜ Xml ドキュメントを文字列に読み込もうとしているのですか?

XML ドキュメントを理解するオブジェクト (XDocumentや などXmlDocument) に XML ドキュメントをロードしてみてください。これらのオブジェクトは、バイト オーダー マークをどう処理するかを知っているからです。

XDocument.Load(stream)(.NET 4)に沿ったもの。

次に、そのドキュメントのテキストが本当に必要な場合は、そのオブジェクトの「OuterXml」文字列プロパティを使用できます。

編集

コードを読むと、基本的に、バイナリとして保存された XML (または Tridion スキーマに準拠していない xml) を出力しようとしているように見えますが、これはベスト プラクティスとは言えません。とにかく、テンプレートの出力を XmlDocument として設定できます。文字列である必要はありません。package.CreateItem のバリエーションを見てください。

于 2013-01-30T15:53:00.410 に答える