导入 XML 时编码 ISO-8859-1 时出现问题

问题描述 投票:0回答:1

由于编码 ISO-8859-1,我在导入一些 XML 时遇到了一个小问题。 该过程目前分为两个阶段,验证 XML 并显示系统中未注册的项目列表和系统中已存在的产品列表的部分,以及实际导入项目并在其中进行关联的部分。他们。系统的。

在第一部分中,当系统中存在没有关联的项目时,它会强制客户端将 XML 产品与系统中的产品关联起来,然后再继续。

由于产品采用 XML 格式: “GPM 25 / VALVULA GPMBRASIL PN 16 COMERCIAL 45° 2.1/2 11 BSP X 5 FPP LATAO C/ VOLANTE Ø 90 MM VERMELHO”

产品插入系统后的样子: “GPM 25 / VALVULA GPMBRASIL PN 16 COMERCIAL 45º 2.1/2 11 BSP X 5 FPP LATAO C/ VOLANTE × 90 MM VERMELHO

我通过我的控制器捕获值,如下所示:

XDocument xdoc = null;
using (StreamReader oReader = new StreamReader(file.InputStream, Encoding.GetEncoding("ISO-8859-1")))
{
     xdoc = XDocument.Load(oReader);
}

using (var xmlReader = xdoc.CreateReader())
{
     importacao.XmlDocument.Load(xmlReader);
}

我用来创建产品列表的方法:

var produtosDoXML = nodeProdutos.Cast\<XmlNode\>().Select(x =\> new
{
Codigo = x\["prod"\]\["cProd"\].InnerText,
Descricao = x\["prod"\]\["xProd"\].InnerText,
NCM = x\["prod"\]\["NCM"\]?.InnerText,
CEST = x\["prod"\]\["CEST"\]?.InnerText,
EANTributavel = x\["prod"\]\["cEANTrib"\]?.InnerText,
EAN = x\["prod"\]\["cEAN"\]?.InnerText,
UnidadeComercial = x\["prod"\]\["uCom"\]?.InnerText,
Quantidade = Convert.ToDecimal(x\["prod"\]\["qCom"\].InnerText, CultureInfo.InvariantCulture),
Desconto = Convert.ToDecimal(x\["prod"\]\["vDesc"\]?.InnerText, CultureInfo.InvariantCulture),
ValorUnitario = Math.Round(Convert.ToDecimal(x\["prod"\]\["vUnCom"\]?.InnerText, CultureInfo.InvariantCulture), 4),
OrdemDeExibicao = int.Parse(x.Attributes\["nItem"\].Value)
});

foreach (var produtoDoXML in produtosDoXML)
{
var produtos = produtosServicosDosFornecedores.Where(x =\> x.CodigoEquivalente == produtoDoXML.Codigo && x.DescricaoEquivalente == produtoDoXML.Descricao);

    if (produtos.Count() > 1)
    {
        throw new CompraException(CompraException.TypeException.ProdutoEquivalenteDeTerceiroDuplicado, "", produtoDoXML.Codigo);
    }
    else if (produtos.Count() == 0)
    {
        var produtosAssociadosAoCodigo = produtosServicosDosFornecedores.Where(x => x.CodigoEquivalente == produtoDoXML.Codigo)
                                                                        .GroupBy(x => x.ProdutoServicoId);
        if (produtosAssociadosAoCodigo.Count() == 1)
        {
            retornoDaImportacao.AdicionarProdutoNaoAssociadoComCodigoExistente(new RetornoImportacaoXMLDeNFeDeCompraDTO.ProdutoNaoAssociadoComCodigoExistente
            {
                IdDoProdutoAssociado = produtosAssociadosAoCodigo.Single().First().ProdutoServico.Id,
                CodigoDoProdutoAssociado = produtosAssociadosAoCodigo.Single().First().ProdutoServico.Codigo,
                DescricaoDoProdutoAssociado = produtosAssociadosAoCodigo.Single().First().ProdutoServico.Descricao,
                NomeDoFornecedor = fornecedor.NomeFantasia,
                IdDoFornecedor = fornecedor.Id,
                Codigo = produtoDoXML.Codigo,
                Descricao = produtoDoXML.Descricao,
                EAN = produtoDoXML.EAN,
                EANTributavel = produtoDoXML.EANTributavel,
                CEST = produtoDoXML.CEST,
                NCM = produtoDoXML.NCM,
                UnidadeComercial = produtoDoXML.UnidadeComercial,
                Valor = produtoDoXML.ValorUnitario,
            });
        }
        else
        {
            retornoDaImportacao.AdicionarErroDeProdutoServico(new RetornoImportacaoXMLDeNFeDeCompraDTO.ErroDeProdutoServico
            {
                Mensagem = string.Format(Language.Exception_ProdutoXNaoEncontrado, $"[{produtoDoXML.Codigo} - {produtoDoXML.Descricao}]"),
                NomeDoFornecedor = fornecedor.NomeFantasia,
                IdDoFornecedor = fornecedor.Id,
                Codigo = produtoDoXML.Codigo,
                Descricao = produtoDoXML.Descricao,
                EAN = produtoDoXML.EAN,
                EANTributavel = produtoDoXML.EANTributavel,
                CEST = produtoDoXML.CEST,
                NCM = produtoDoXML.NCM,
                UnidadeComercial = produtoDoXML.UnidadeComercial,
                Valor = produtoDoXML.ValorUnitario
            });
        }
    }
    else
    {
        retornoDaImportacao.AdicionarProdutoAssociado(new RetornoImportacaoXMLDeNFeDeCompraDTO.ProdutoAssociado
        {
            IdDoProduto = produtos.First().Id,
            CodigoDoProdutoAssociado = produtos.First().ProdutoServico.Codigo,
            DescricaoDoProdutoAssociado = produtos.First().ProdutoServico.Descricao,
            NomeDoFornecedor = fornecedor.NomeFantasia,
            IdDoFornecedor = fornecedor.Id,
            Codigo = produtoDoXML.Codigo,
            Descricao = produtoDoXML.Descricao,
            EAN = produtoDoXML.EAN,
            EANTributavel = produtoDoXML.EANTributavel,
            CEST = produtoDoXML.CEST,
            NCM = produtoDoXML.NCM,
            UnidadeComercial = produtoDoXML.UnidadeComercial,
            Valor = produtoDoXML.ValorUnitario,
        });
    }
}

所以由于产品插入时看起来不一样,当我以后需要再次比较时,它不会找到已经在系统中注册的产品。

c# .net encoding utf-8 iso-8859-1
1个回答
-1
投票

如果您确定您的数据以UTF-8编码存储在您的系统(数据库)中,您可以在使用StreamReader读取数据后将XDocument(xdoc)编码更改为UTF-8:

XDocument xdoc = null;
using (StreamReader oReader = new StreamReader(file.InputStream, Encoding.GetEncoding("ISO-8859-1")))
{
     xdoc = XDocument.Load(oReader);
}
xdoc.Declaration = new XDeclaration("1.0", "utf-8", "yes");

using (var xmlReader = xdoc.CreateReader())
{
     importacao.XmlDocument.Load(xmlReader);
}

因此您可以确定您的 xml 文件在保存时已经是 UTF-8 编码的。

© www.soinside.com 2019 - 2024. All rights reserved.