iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
2
Modern Web

輕量高效.NET Core開源Blog引擎:Miniblog.Core系列 第 24

24.XML資料保存出現0x1D is an invalid character錯誤

  • 分享至 

  • xImage
  •  

今天遇到IT鐵人賽文章同步,保存XML資料出現截斷資料異常hexadecimal value 0x1D is an invalid character,檢查發現出錯在SaveAsync。
2018-10-24.22.45.25-image.png

public override async Task SavePost(Post post)
{
    string filePath = GetFilePath(post);
    XDocument doc = new XDocument(
                    new XElement("post",
                        //..略
                        new XElement("content", post.Content),
                        //..略
                    ));
    using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
    {
        await doc.SaveAsync(fs, SaveOptions.None, CancellationToken.None).ConfigureAwait(false);
    }
}

原因在ASCII table有128符號,其中有許多符號不能使用在XML
2018-10-24.22.53.26-image.png

最直接解決方式,把不能使用的符號都以空白字串取代,這邊有S.O大大寫的Regex:

static string ReplaceHexadecimalSymbols(string txt)
{
    string r = "[\x00-\x08\x0B\x0C\x0E-\x1F\x26]";
    return Regex.Replace(txt, r,"",RegexOptions.Compiled);
}

補充另外一個方式,關閉Character驗證:

SaveAsync有三個多型方法,使用StreamTextWriterXmlWriter:

public Task SaveAsync(Stream stream, SaveOptions options, CancellationToken cancellationToken);
public Task SaveAsync(TextWriter textWriter, SaveOptions options, CancellationToken cancellationToken);
public Task SaveAsync(XmlWriter writer, CancellationToken cancellationToken);

從Stream改用XmlWriter設定XmlWriterSettings使用UTF-8格式並且關閉Character驗證。

//使用UTF-8加上關閉檢查字節,避免invalid character問題
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings { Async =true,Encoding = Encoding.UTF8, CheckCharacters = false };
using (XmlWriter writer = XmlWriter.Create(filePath, xmlWriterSettings))
{
        await doc.SaveAsync(writer, CancellationToken.None).ConfigureAwait(false);
}

除非逼不得已,不建議使用補充方式,但可以了解xml的一點規則。


參考:


上一篇
23.使用SQLite推上雲端發生意外
下一篇
25.NET Core密碼PBKDF2加密方式處理
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言