C sharp - Detectar que elemento tiene reverenciado un "subelemento" en XML

 
Vista:
sin imagen de perfil
Val: 3
Ha aumentado su posición en 10 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Detectar que elemento tiene reverenciado un "subelemento" en XML

Publicado por Raymond (2 intervenciones) el 12/12/2018 16:30:29
Hoa a todos,

Estoy leyendo desde C# un archivo XML, el cual tomo sus atributos referenciados a productos y un desglose de impuestos de estos productos.

Mi problema que me afronto es que no puedo como determinar que elemento tiene asignado la referencia de impuestos ya que no todos los productos tienen impuestos.

Les presento parte del XML que trato de obtener el producto y su derivado de impuesto.

<dax:Productos>
<dax:Producto Cantidad="1" Clave="50407044" Unidad="H87" Descripcion="OA MC CORMICK 665 GRS" Descuento="0.00" Importe="45.00" Folio="7501003313782" Unidad="pza" Precio="45.00" />
<dax:Producto Cantidad="1" Clave="50131800" Unidad="H87" Descripcion="QUESO SINGLES 288 GRS" Descuento="0.00" Importe="44.50" Folio="7622300337704" Unidad="pza" Precio="44.50" />
<dax:Producto Cantidad="1" Clave="50171900" Unidad="H87" Descripcion="PASTA LA MORENA 300 GRS" Descuento="0.00" Importe="8.50" Folio="7501062700639" Unidad="pza" Precio="8.50" />
<dax:Impuestos>
<dax:RefImpuesto>
<dax:Impex Precio="8.50" Importe="1.36" Impuesto="002" Iva="0.160000" />
</dax:RefImpuesto>
</dax:Impuestos>
</dax:Producto>
<dax:Producto Cantidad="1" Clave="50181900" Unidad="H87" Descripcion="PAN BIMBO 540 GRS" Descuento="0.00" Importe="32.90" Folio="7501000131440" Unidad="pza" Precio="32.90" />
<dax:Producto Cantidad="1" Clave="50201709" Unidad="H87" Descripcion="CAFE LOS PORT.DCORD 180 GRS" Descuento="0.00" Importe="85.20" Folio="7501038410302" Unidad="pza" Precio="85.20" />
<dax:Producto Cantidad="1" Clave="50201709" Unidad="H87" Descripcion="CAFE TASTER CHOICE 100 GRS" Descuento="0.00" Importe="101.15" Folio="7501058616111" Unidad="pza" Precio="101.15" />
<dax:Producto Cantidad="1" Clave="14111703" Unidad="H87" Descripcion="SERVITOALLA KE PRECIO 1 PZ" Descuento="0.00" Importe="18.706897" Folio="7501010795700" Unidad="pza" Precio="18.706897">
<dax:Impuestos>
<dax:RefImpuesto>
<dax:Impex Precio="18.706897" Importe="2.993103" Impuesto="002" Iva="0.160000" />
</dax:RefImpuesto>
</dax:Impuestos>
</dax:Producto>

Lo que deseamos tomar es el producto "PASTA LA MORENA 300 GRS" y "SERVITOALLA KE PRECIO 1PZ" con sus respectivos impuestos.

Gracias, Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 218
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Detectar que elemento tiene reverenciado un "subelemento" en XML

Publicado por Cesar (82 intervenciones) el 12/12/2018 16:50:39
Hola.

Yo exportaria ese XML a clase en C# (usando alguna herramienta como https://xmltocsharp.azurewebsites.net/), para tener un modelo,

Posteriormente, deserializaria el XML en un objeto C# (empleando dicho modelo). lo cual te devolveria un arreglo de objetos Productos.

Y por ultimo, ya solo es cuestion de barrer dicho arreglo, y si la propiedad Impuestos es distinta de Nulo, es que tiene impuesto. Si es Nulo, no tiene impuesto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 3
Ha aumentado su posición en 10 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Detectar que elemento tiene reverenciado un "subelemento" en XML

Publicado por Raymond (2 intervenciones) el 12/12/2018 17:28:32
Hola Cesar, muchas gracias por tu respuesta.

De hecho lo tengo como me comentas. El problema que tenemos es que no logramos identificar que productos son los que tienen asignados impuestos. Nuestro código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if (xFile.GetElementsByTagName("dax:Productos") == null)
    return;
XmlNodeList productos = xFile.GetElementsByTagName("dax:Productos");
 
 
if (((XmlElement)productos[0]).GetElementsByTagName("dax:producto") == null)
    return;
 
XmlNodeList listaproductos = ((XmlElement)productos[0]).GetElementsByTagName("dax:Producto");
 
foreach (XmlElement nodo in listaproductos)
{
    if (xFile.GetElementsByTagName("dax:Impuestos") == null)
        return;
    .(Sin embargo entra a este ciclo, no debería de entrar porque no tiene impuesto)
                        .
    .
    .
    //El resultado es que siempre  dan los valores 
    //de Precio="8.50" Importe="1.36" Impuesto="002" Iva="0.160000")
    //por cada uno de los productos, Esto es incorrecto Ya que solo 2 productos tienen impuestos
    //El problema que tenemos es que no logramos determinar realmente quien
    //tiene los impuestos.
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Detectar que elemento tiene reverenciado un "subelemento" en XML

Publicado por miguelZ (8 intervenciones) el 13/12/2018 23:21:35
De hecho no lo tienes como lo comento Cesar

Primero recomiendo que rediseñes tu XML tu propiedad dax:RefImpuesto sale sobrando
y los nombres de las propiedes cambialas a algo que se entienda mejor por ejemplo:

importe => Iva
Impuesto= > ImpuestoClave o ImpuestoId
Iva => IvaPorcentaje



Debes definir los objetos en C# con todas las propiedades que quieres extraer del documento XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//Definicion de clases
public class Impuesto
{
  double Importe{}
 double IVA {}
 ...
}
 
public class Producto
{
int   Cantidad {}
string Clave{}
double    Impuesto {}
 
//esta propiedad no se mapea a xml
 
public bool TieneImpuesto{ return Impuesto>0}
}
 
productos
{
   IList<Productos> Productos{}
 
  //se pueden declarar propiedades sin incluirlas en la transformacion a XML
  CostoTotal
  {
   //  sumatoria del precio de todos los products
  }
  IvaTotal
{
  //sumatoria de todos los 
}
}
 
 
 
//pseudo codigo
path = Directory.GetCurrentDirectory() + @"\ProductosInventario.xml";
xmlInputData = File.ReadAllText(path);
 
Productos  productos = ser.Deserialize<Productos>(xmlInputData);
 
//buscando productos con impuesto
 
var productosConImpuesto= productos.Where(p=>p.impuesto>0);
 
 //o si se usa la propiedad extra agregada
 
var productosConImpuesto= productos.Where(p=>p.TieneImpuesto);



Saludos.
Miguel Z

PS. Aqui puedes ver un ejemplo de mapeo de XML a objetos C# y viceversa

https://www.codeproject.com/Articles/1163664/%2FArticles%2F1163664%2FConvert-XML-to-Csharp-Object
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar