6

さて、これはそれをやった!皆さんのお陰で!

public class Result
{
    public String htmlEscaped
    {
        set;
        get;
    }

    [XmlIgnore]
    public String htmlValue
    { set; get; }

    [XmlElement("htmlValue")]
    public XmlCDataSection htmlValueCData
    {
        get
        {
            XmlDocument _dummyDoc = new XmlDocument();
            return _dummyDoc.CreateCDataSection(htmlValue);
        }
        set { htmlValue = (value != null) ? value.Data : null; }
    }
}

    Result r = new Result();
    r.htmlValue = ("<b>Hello</b>");
    r.htmlEscaped = ("<b>Hello</b>");
    XmlSerializer xml = new XmlSerializer(r.GetType());
    TextWriter file = new StreamWriter(Environment.CurrentDirectory + "\\results\\result.xml", false, System.Text.Encoding.Default);
    xml.Serialize(file, r);
    file.Close();

結果:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlEscaped>&lt;b&gt;Hello&lt;/b&gt;</htmlEscaped>
  <htmlValue><![CDATA[<b>Hello</b>]]></htmlValue>
</Result>

ご覧のとおり、CDATA が戻り値の型になった後、ファイルシステムの XML ファイルでエスケープされた html はなくなりました。JSON シリアライゼーションは機能しなくなりましたが、これは型を少し拡張することで修正できます。


質問は:

たぶん誰かがそれを行う方法を知っています...

私はこのクラスを持っています:

public class Result
{
    public String htmlValue
    {
        get;
        set;
    }
}

これを使用してXMLにシリアル化します

Result res = new Result();
res.htmlValue = "<p>Hello World</p>";
XmlSerializer s = new XmlSerializer(res.GetType());
TextWriter w = new StreamWriter(Environment.CurrentDirectory + "\\result.xml", false, System.Text.Encoding.Default);
s.Serialize(w, res);
w.Close();

私はこれを得る:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlValue>&lt;b&gt;Hello World&lt;/b&gt;</htmlValue>
</Result>

これを取得するには、何を変更する必要がありますか:

<?xml version="1.0" encoding="Windows-1252"?>
<Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <htmlValue><![CDATA[<b>Hello World</b>]]></htmlValue>
</Result>

すでに検索しましたが、何も見つかりません。htmlValue の型は、他のシリアライゼーション JSON などのため、文字列のままにする必要があります。

トリッキーなもの...提案を事前にありがとう

  • HTML は C# 内の String で正しいです。デコードまたはエンコードする理由
  • XmlSerializer は、HTML をエスケープして XML ファイルに保存しました。
  • 消費に C# を使用しないでください。

これを受け入れる外部ツールは次のとおりです。

<htmlValue><![CDATA[<b>Hello World</b>]]></htmlValue>

だがしかし

<htmlValue>&lt;b&gt;Hello World&lt;/b&gt;</htmlValue>

JSONシリアライザーでも同じことを行います。ハードドライブ上のファイルでは、HTMLが正しく保存されます。それを防ぐために HTTP ユーティリティを使用する理由と場所は? そして、それを<![CDATA[ ]]>回避する方法。

コードサンプルを教えてください。C# 独自のもの以外のシリアライザーはありますか?

この Link .NET XML Serialization of CDATA ATTRIBUTEを Marco André Silva から見つけました。これを行う必要がありますが、タイプを変更せずにこれを含める方法は異なりますか?

4

3 に答える 3

7

これがあなたが望むことを達成するための簡単なトリックです。文字列プロパティの代わりにXmlCDataSectionプロパティをシリアル化する必要があります:

(これはジョンの提案とほとんど同じですが、少し単純です...)

public class Result
{
    [XmlIgnore]
    public String htmlValue
    {
        get;
        set;
    }

    private static XmlDocument _dummyDoc;

    [XmlElement("htmlValue")]
    public XmlCDataSection htmlValueCData
    {
        get { return _dummyDoc.CreateCDataSection(htmlValue); }
        set { htmlValue = (value != null) ? value.Data : null; }
    }
}
于 2009-10-01T22:19:54.873 に答える
0

同じ問題と解決策については、「XMLSerializer を使用した CDATA シリアライゼーション」を参照してください。

ところで、ベンダーが存在しなくなった場合は、別の製品を使用するときが来たように思えます。10 年以上しか存在していない XML 仕様を理解している可能性があります。

于 2009-10-01T21:43:00.893 に答える