由于编码 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,
});
}
}
所以由于产品插入时看起来不一样,当我以后需要再次比较时,它不会找到已经在系统中注册的产品。
如果您确定您的数据以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 编码的。