使用序列化C#访问XML中的特定元素属性

时间:2019-07-16 16:16:17

标签: c# xml serialization

我已经拥有具有这种结构的XML,但是我正试图访问第一个“ Impuestos”以到达其中的“ Traslado”,但是它无法按我的方式工作,我是新手XML,我不知道如何指定需要获取的属性。

我总是在没有“ Concepto”的情况下获取结构的值,并且我不希望这些值。

<cfdi:Concepto ClaveProdServ="44122016" NoIdentificacion="006001" Cantidad="8.000" ClaveUnidad="XBX" Unidad="Caja" Descripcion="BROCHE ARCHIVO BACO B-182 8CMS CAJAC/50 CAJA AZUL" ValorUnitario="33.55" Importe="268.40" Descuento="0.00">
    <cfdi:Impuestos>
        <cfdi:Traslados>
            <cfdi:Traslado Base="268.40" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="42.94"/>
        </cfdi:Traslados>
    </cfdi:Impuestos>
</cfdi:Concepto>
<cfdi:Impuestos TotalImpuestosTrasladados="415.76">
    <cfdi:Traslados>
        <cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="415.76"/>
    </cfdi:Traslados>
</cfdi:Impuestos>

这是我用于执行此操作的代码,该代码基于我在Microsoft论坛等中看到的代码。

public class Comprobante {
    [XmlArrayItem("Concepto")]
    public TConcepto[] Conceptos;

    [XmlElement()]
    public TImpuestos Impuestos;
}

public class TImpuestos
{
    [XmlArrayItem("Traslado")]
    public TTraslado[] Traslados;
}

public class TTraslado
{
    [XmlAttribute()]
    public string Impuesto;
    [XmlAttribute()]
    public string Importe;
}

使用此代码,我得到的值是Impuesto =“ 002”和Importe =“ 415.76”。
但是我想得到Impuesto =“ 002”和Importe =“ 42.94”,谢谢您的帮助,以指导我实现目标的最佳方法。

1 个答案:

答案 0 :(得分:0)

使用Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication120
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement Impuestos = doc.Descendants().Where(x => x.Name.LocalName == "Impuestos").FirstOrDefault();

            XElement Traslado = Impuestos.Descendants().Where(x => x.Name.LocalName == "Traslado").FirstOrDefault();

            string Impuesto =  (string)Traslado.Attribute("Impuesto");
            decimal Importe = (decimal)Traslado.Attribute("Importe");
        }
    }


}