2

XmlSerializer を使用して、.NET の XML ドキュメント コメントの出力を逆シリアル化しようとしています。参考までに、xml ドキュメントの出力は次のようになります。

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>Apt.Lib.Data.Product</name>
    </assembly>
    <members>
        <member name="P:MyNamespace.MyType.MyProperty">
            <summary>See <see cref="T:MyNamespace.MyOthertype"/> for more info</summary>
        </member>
        ...
    </members>
</doc>

シリアライザーを生成するために使用しているオブジェクトは次のとおりです。

    [XmlRoot("doc")]
    public class XmlDocumentation
    {
        public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(XmlDocumentation));

        [XmlElement("assembly")]
        public AssemblyName Assembly { get; set; }
        [XmlArray("members")]
        [XmlArrayItem("member")]
        public List<Member> Members { get; set; }

        public class AssemblyName
        {
            [XmlElement("name")]
            public string Name { get; set; }
        }

        public class Member
        {
            [XmlAttribute("name")]
            public string Name { get; set; }
            [XmlElement("summary")]
            public string Summary { get; set; }
        }
}

問題は、シリアライザーが埋め込みの see cref タグに遭遇したときです。その場合、シリアライザーは次の例外をスローします。

System.InvalidOperationException : XML ドキュメントにエラーがあります (147、27)。----> System.Xml.XmlException : 予期しないノード タイプ Element. ReadElementString メソッドは、単純なコンテンツまたは空のコンテンツを持つ要素でのみ呼び出すことができます。行 147、位置 27。

逆シリアル化中に要約タグの内容全体を文字列としてキャプチャするにはどうすればよいですか?

4

1 に答える 1

0

cref タグ自体に不正な文字が含まれています。具体的には、<、> を XML 要素のコンテンツに埋め込むことはできません。文字列をシリアライズまたはデシリアライズする前にサニタイズする必要があります。

特定の文字をエスケープまたは置換する方法に特定のルールを適用できるようにする必要がある場合は、次のようにすることができます。

    string ScrubString(string dirty)
    {
        char[] charArray = dirty.ToCharArray();
        StringBuilder strBldr = new StringBuilder(dirty.Length);

        for (int i = 0; i < charArray.Length; i++)
        {
           if(IsXmlSafe(charArray[i]))
           {
              strBldr.Append(charArray[i]);
           }
           else
           {
              //do something to escape or replace that character. 
           }
        }
        retrun strBldr.ToString();
    }


    bool IsXmlSafe(char c)
    {
       int charInt = Convert.ToInt32(c);

       return charInt == 9
           || charInt == 13
           || (charInt >= 32    && charInt <= 9728)
           || (charInt >= 9983  && charInt <= 55295)
           || (charInt >= 57344 && charInt <= 65533)
           || (charInt >= 65536 && charInt <= 1114111);
    }

ここでいくつかのアプローチを使用して、正規表現を使用して不正な文字を削除することもできます。

XML の無効な文字

于 2013-06-13T16:39:08.780 に答える