XML скрити символи, как да премахнете Bom

Опитвам се да създам XML файл чрез код. Файлът се създава успешно, но системата ми, необходима за файла, чете само UTF-8. Файлът не се зарежда успешно, тъй като има някои скрити знаци.

Тези скрити знаци генерират грешка. Мисля, че трябва да настроя bom на false, но нямам представа как. по-долу можете да намерите моя код, използван за генериране на моя файл.

 XElement xElement = new XElement("Transaction", 
                new XElement("TransactionNumber", counter),
                new XElement("TransactionReferenceNumber", "CRE" + payItem.ID),
                new XElement("TransactionDate", DateTime.Today.Date.ToString("yyyy-MM-dd")),
                new XElement("BankID", "99"),
                new XElement("SourceAccountNumber", currentAccount.AccountNumber),
                new XElement("BeneficiaryName", RemoveSpecialCharacters(payItem.WIRE_BENEF_NAME)),
                new XElement("PaymentDetails1", details),
                new XElement(checkForAccountDetails(payItem.WIRE_BENEF_BANK_IBAN), getIBANorNumber(payItem)),
                new XElement("POCurrency", payItem.Currency),
                new XElement("POAmount", payItem.NET_DEPOSIT),
                new XElement("BeneficiaryType", "FINANCIAL"),
                new XElement("Residence", "NON-RESIDENT"),
                new XElement("IncurredChargesBy", "SHARED"),
                new XElement("ExchangeControlClassification", "OTHER PAYMENTS"),
                new XElement("TypeofPayment", "T3"),
                new XElement("SectorCode", "COS"),
                new XElement("Priority", getPaymentPriority(payItem.Currency)),
                new XElement("SwiftAddress", payItem.WIRE_BENEF_BANK_SWIFT_CDE),
                new XElement("BankCountry", currentBank.Country.ToUpper())
            );
            xDetail.Add(xElement);

По принцип използвам C# и класа XElement, който създава XML чрез предаване на етикета с име и данни в параметри.

Накрая съхранявам всички XElements в XDocument, както е показано по-долу, за да създам документ в стил XML и да запазя файла като .XPO

XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
xdoc.Save(pathDesktop + "\\22CRE002.XPO");

person Mark Fenech    schedule 20.09.2013    source източник


Отговори (1)


Ако всичко, което искате, е да избегнете създаването на BOM, това е лесно - просто създайте UTF8Encoding, който не използва такъв, и XmlWriterSettings с това кодиране:

var path = Path.Combine(pathDesktop, "\\22CRE002.XPO");
var settings = new XmlWriterSettings { 
    Encoding = new UTF8Encoding(false),
    Indent = true
};
using (var writer = XmlWriter.Create(path, settings))
{
    doc.Save(writer);
}

Или просто създайте подходящ TextWriter:

var path = Path.Combine(pathDesktop, "\\22CRE002.XPO");
using (var writer = new StreamWriter(path, false, new UTF8Encoding(false)))
{
    doc.Save(writer);
}
person Jon Skeet    schedule 23.09.2013
comment
това ще създаде ли някакви скрити знаци? - person Mark Fenech; 23.09.2013
comment
@MarkFenech: Не - това е смисълът на създаването на нов UTF8Encoding. Този конструктор създава такъв, който не включва знак за ред на байтове. - person Jon Skeet; 23.09.2013
comment
кой е най-добрият вариант? - person Mark Fenech; 23.09.2013
comment
Ако трябва само да посочите кодирането, тогава втората форма е добра. Ако искате да промените други настройки, използвайте първата. - person Jon Skeet; 23.09.2013
comment
работата е там, че когато използвах първия, xml кодът беше написан успешно във файла, но само в 1 ред... От друга страна, когато опитах втория пример, се показва грешка, защото File.CreateText приема само 1 претоварване. - person Mark Fenech; 25.09.2013
comment
@MarkFenech: Първият е фиксиран чрез указване на свойството Indent; вторият е фиксиран чрез използване на StreamWriter вместо това. Редактирах отговора - и двамата трябва да работят сега. (Коригирайте допълнително настройките за знак за отстъп и т.н.) - person Jon Skeet; 25.09.2013