【问题标题】:XML hidden characters, how to remove BomXML隐藏字符,如何删除Bom
【发布时间】:2013-09-25 21:43:02
【问题描述】:

我正在尝试通过代码创建 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。

最后,我将所有 XElement 存储在 XDocument 中,如下所示,以创建 XML 样式文档并将文件另存为 .XPO

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

【问题讨论】:

    标签: c# xml utf-8 character-encoding xelement


    【解决方案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);
    }
    

    【讨论】:

    • 这会创建任何隐藏字符吗?
    • @MarkFenech:不——这就是创建一个新的UTF8Encoding 的重点。该构造函数创建一个不包含字节顺序标记的构造函数。
    • 哪个是最好的选择?
    • 如果只需要指定编码,那么第二种形式就可以了。如果您想调整任何其他设置,请使用第一个。
    • 问题是,当我使用第一个时,xml 代码已成功写入文件中,但仅在 1 行中......另一方面,当尝试第二个示例时,显示错误,因为 File .CreateText 只接受 1 个重载。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2019-05-29
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2016-01-04
    • 2014-12-03
    相关资源
    最近更新 更多