首頁 三十天.NET❤️Azure漸進式開發專案 輕量高效.NET Core開源Blog引擎:Miniblog.Core
首頁 三十天.NET❤️Azure漸進式開發專案 輕量高效.NET Core開源Blog引擎:Miniblog.Core
×

IT鐵人賽連結:https://ithelp.ithome.com.tw/articles/10204899

今天遇到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的一點規則。


參考:


留言


Comments are closed