Скрытые символы XML, как удалить Bom

Я пытаюсь создать файл XML с помощью кода. Файл создается успешно, но моя система, необходимая для файла, читает только UTF-8. Файл не загружается успешно, так как в нем есть скрытые символы.

Эти скрытые символы вызывают ошибку. Я думаю, что мне нужно установить ложное значение, но не знаю, как это сделать. ниже вы можете найти мой код, используемый для создания моего файла.

 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)


Если все, что вам нужно, это избежать создания спецификации, это легко - просто создайте 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
дело в том, что когда я использовал 1-й, код xml был успешно написан в файле, но всего в 1 строке .... С другой стороны, при попытке 2-го примера отображается ошибка, потому что File.CreateText принимает только 1 перегрузку. - person Mark Fenech; 25.09.2013
comment
@MarkFenech: первое исправляется указанием свойства Indent; второе исправлено с использованием вместо этого StreamWriter. Я отредактировал ответ - теперь они оба должны работать. (Настройте параметры для отступа и т. д.) - person Jon Skeet; 25.09.2013