我正在处理许多类似的XML文件,但有时每个文件都有或多或少的节点。(假设这是购买的账单或类似的东西)。但是,即使XML与结构不匹配,我也需要对其进行反序列化(我需要为我的类获取公共节点)。节点名称不会不同,但可能会有比平常更多的节点
String MainXMLPATH = AppPrincipal.PathDeLecturaIndividual; //Gets xml path from another form
XmlDocument dom = new XmlDocument();
dom.Load(MainXMLPATH); //Loads xml
XmlSerializer serializer = new XmlSerializer(typeof(FacturaElectronica)); //Autogenerated Visual Studio class from XML
FacturaElectronica I;
using (Stream reader = new FileStream(MainXMLPATH, FileMode.Open)) {
// Call the Deserialize method to restore the object's state.
I = (FacturaElectronica)serializer.Deserialize(reader);
}
Console.WriteLine(I.Clave + "," + I.CodigoActividad + "," + I.CondicionVenta + "," + I.DetalleServicio + "," + I.Emisor.CorreoElectronico);//Prints the value of my xml
这是我的班级:
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica", IsNullable = false)]
public partial class FacturaElectronica {
private string claveField;
private uint codigoActividadField;
private ulong numeroConsecutivoField;
private System.DateTime fechaEmisionField;
private FacturaElectronicaEmisor emisorField;
private FacturaElectronicaReceptor receptorField;
private byte condicionVentaField;
private byte plazoCreditoField;
private byte[] medioPagoField;
private FacturaElectronicaLineaDetalle[] detalleServicioField;
private FacturaElectronicaOtrosCargos[] otrosCargosField;
private FacturaElectronicaResumenFactura resumenFacturaField;
private Signature signatureField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(DataType = "integer")]
public string Clave {
get {
return this.claveField;
}
set {
this.claveField = value;
}
}
/// <remarks/>
public uint CodigoActividad {
get {
return this.codigoActividadField;
}
set {
this.codigoActividadField = value;
}
}
/// <remarks/>
public ulong NumeroConsecutivo {
get {
return this.numeroConsecutivoField;
}
set {
this.numeroConsecutivoField = value;
}
}
/// <remarks/>
public System.DateTime FechaEmision {
get {
return this.fechaEmisionField;
}
set {
this.fechaEmisionField = value;
}
}
/// <remarks/>
public FacturaElectronicaEmisor Emisor {
get {
return this.emisorField;
}
set {
this.emisorField = value;
}
}
/// <remarks/>
public FacturaElectronicaReceptor Receptor {
get {
return this.receptorField;
}
set {
this.receptorField = value;
}
}
/// <remarks/>
public byte CondicionVenta {
get {
return this.condicionVentaField;
}
set {
this.condicionVentaField = value;
}
}
/// <remarks/>
public byte PlazoCredito {
get {
return this.plazoCreditoField;
}
set {
this.plazoCreditoField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("MedioPago")]
public byte[] MedioPago {
get {
return this.medioPagoField;
}
set {
this.medioPagoField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("LineaDetalle", IsNullable = false)]
public FacturaElectronicaLineaDetalle[] DetalleServicio {
get {
return this.detalleServicioField;
}
set {
this.detalleServicioField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("OtrosCargos")]
public FacturaElectronicaOtrosCargos[] OtrosCargos {
get {
return this.otrosCargosField;
}
set {
this.otrosCargosField = value;
}
}
/// <remarks/>
public FacturaElectronicaResumenFactura ResumenFactura {
get {
return this.resumenFacturaField;
}
set {
this.resumenFacturaField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "http://www.w3.org/2000/09/xmldsig#")]
public Signature Signature {
get {
return this.signatureField;
}
set {
this.signatureField = value;
}
}
}
XML示例:
<FacturaElectronica xmlns="https://cdn.comprobanteselectronicos.go.cr/xml-schemas/v4.3/facturaElectronica" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<Clave>50601082000310133465800100001010000038444100147136</Clave>
<CodigoActividad>642005</CodigoActividad>
<NumeroConsecutivo>00100001010000038444</NumeroConsecutivo>
<FechaEmision>2020-08-01T19:47:58-06:00</FechaEmision>
<Emisor>
<Nombre>Callmyway NY</Nombre>
<Identificacion>
<Tipo>02</Tipo>
<Numero>3101334658</Numero>
</Identificacion>
<Ubicacion>
<Provincia>1</Provincia>
<Canton>01</Canton>
<Distrito>05</Distrito>
<Barrio>13</Barrio>
<OtrasSenas>COSTADO NORTE COLEGIO ABOGADOS FRENTE ENTRADA PRINCIPAL</OtrasSenas>
</Ubicacion>
<Telefono>
<CodigoPais>506</CodigoPais>
<NumTelefono>40004000</NumTelefono>
</Telefono>
<CorreoElectronico>facturacion@callmyway.com</CorreoElectronico>
</Emisor>
<Receptor>
<Nombre>GRUPO APLIX LATINOAMERICA SOCIEDAD ANONIMA</Nombre>
<Identificacion>
<Tipo>02</Tipo>
<Numero>3101753993</Numero>
</Identificacion>
</Receptor>
<CondicionVenta>01</CondicionVenta>
<PlazoCredito>0</PlazoCredito>
<MedioPago>04</MedioPago>
<MedioPago>02</MedioPago>
<DetalleServicio>
<LineaDetalle>
<NumeroLinea>1</NumeroLinea>
<CodigoComercial>
<Tipo>04</Tipo>
<Codigo>TR</Codigo>
</CodigoComercial>
<Cantidad>1</Cantidad>
<UnidadMedida>St</UnidadMedida>
<Detalle>Consumo Mensual Celular (2020-07)(6h23m9s)</Detalle>
<PrecioUnitario>839.99764</PrecioUnitario>
<MontoTotal>839.99764</MontoTotal>
<SubTotal>839.99764</SubTotal>
<BaseImponible>839.99764</BaseImponible>
<Impuesto>
<Codigo>01</Codigo>
<CodigoTarifa>08</CodigoTarifa>
<Tarifa>13.00</Tarifa>
<Monto>109.19969</Monto>
</Impuesto>
<ImpuestoNeto>109.19969</ImpuestoNeto>
<MontoTotalLinea>949.19733</MontoTotalLinea>
</LineaDetalle>
<LineaDetalle>
<NumeroLinea>2</NumeroLinea>
<CodigoComercial>
<Tipo>04</Tipo>
<Codigo>TR</Codigo>
</CodigoComercial>
<Cantidad>1</Cantidad>
<UnidadMedida>St</UnidadMedida>
<Detalle>Consumo Mensual Fijo (2020-07)(1h58m54s)</Detalle>
<PrecioUnitario>903.64052</PrecioUnitario>
<MontoTotal>903.64052</MontoTotal>
<SubTotal>903.64052</SubTotal>
<BaseImponible>903.64052</BaseImponible>
<Impuesto>
<Codigo>01</Codigo>
<CodigoTarifa>08</CodigoTarifa>
<Tarifa>13.00</Tarifa>
<Monto>117.47327</Monto>
</Impuesto>
<ImpuestoNeto>117.47327</ImpuestoNeto>
<MontoTotalLinea>1021.11379</MontoTotalLinea>
</LineaDetalle>
<LineaDetalle>
<NumeroLinea>3</NumeroLinea>
<CodigoComercial>
<Tipo>04</Tipo>
<Codigo>TR</Codigo>
</CodigoComercial>
<Cantidad>1</Cantidad>
<UnidadMedida>St</UnidadMedida>
<Detalle>Consumo Mensual internacional (2020-07)(2m47s)</Detalle>
<PrecioUnitario>297.81699</PrecioUnitario>
<MontoTotal>297.81699</MontoTotal>
<SubTotal>297.81699</SubTotal>
<BaseImponible>297.81699</BaseImponible>
<Impuesto>
<Codigo>01</Codigo>
<CodigoTarifa>08</CodigoTarifa>
<Tarifa>13.00</Tarifa>
<Monto>38.71621</Monto>
</Impuesto>
<ImpuestoNeto>38.71621</ImpuestoNeto>
<MontoTotalLinea>336.53320</MontoTotalLinea>
</LineaDetalle>
<LineaDetalle>
<NumeroLinea>4</NumeroLinea>
<CodigoComercial>
<Tipo>04</Tipo>
<Codigo>TR</Codigo>
</CodigoComercial>
<Cantidad>1</Cantidad>
<UnidadMedida>St</UnidadMedida>
<Detalle>Seleccion numero a la carta: 40015220</Detalle>
<PrecioUnitario>4357.29847</PrecioUnitario>
<MontoTotal>4357.29847</MontoTotal>
<SubTotal>4357.29847</SubTotal>
<BaseImponible>4357.29847</BaseImponible>
<Impuesto>
<Codigo>01</Codigo>
<CodigoTarifa>08</CodigoTarifa>
<Tarifa>13.00</Tarifa>
<Monto>566.44880</Monto>
</Impuesto>
<ImpuestoNeto>566.44880</ImpuestoNeto>
<MontoTotalLinea>4923.74727</MontoTotalLinea>
</LineaDetalle>
</DetalleServicio>
<OtrosCargos>
<TipoDocumento>02</TipoDocumento>
<Detalle>Timbre de la Cruz Roja</Detalle>
<MontoCargo>63.98754</MontoCargo>
</OtrosCargos>
<OtrosCargos>
<TipoDocumento>99</TipoDocumento>
<Detalle>Contribucion 911</Detalle>
<MontoCargo>47.99065</MontoCargo>
</OtrosCargos>
<ResumenFactura>
<CodigoTipoMoneda>
<CodigoMoneda>CRC</CodigoMoneda>
<TipoCambio>1</TipoCambio>
</CodigoTipoMoneda>
<TotalServGravados>6398.75362</TotalServGravados>
<TotalServExentos>0.00000</TotalServExentos>
<TotalServExonerado>0.00000</TotalServExonerado>
<TotalMercanciasGravadas>0.00000</TotalMercanciasGravadas>
<TotalMercanciasExentas>0.00000</TotalMercanciasExentas>
<TotalMercExonerada>0.00000</TotalMercExonerada>
<TotalGravado>6398.75362</TotalGravado>
<TotalExento>0.00000</TotalExento>
<TotalExonerado>0.00000</TotalExonerado>
<TotalVenta>6398.75362</TotalVenta>
<TotalDescuentos>0.00000</TotalDescuentos>
<TotalVentaNeta>6398.75362</TotalVentaNeta>
<TotalImpuesto>831.83797</TotalImpuesto>
<TotalOtrosCargos>111.97819</TotalOtrosCargos>
<TotalComprobante>7342.56978</TotalComprobante>
</ResumenFactura>
</FacturaElectronica>
我尝试从更大的xml文件创建计费类,但由于缺少节点而无法工作。由于这个类与XML结构不匹配,所以它不能处理除我与您共享的那个文件以外的所有文件。我希望打开类似结构的XML文件
已解决
我对使用Visual Studio自动生成代码感到厌烦。经过一番深入研究,我找到了XSD.exe工具。通过这个工具,我了解了如何从XSD文件创建类。为了让它工作,我需要下载链接的模式:
首先,我打开VS 2019的开发人员命令提示符,然后我使用CD命令到达文件路径,之后,我使用命令:
xsd/c {random_xsd_file}。xsd {another_rnd_xsd_file} . xsd
这样,我创建了一个.cs文件,其中包含所有需要的类。(如果有人有任何问题,请随时提问,我花了很多时间研究这个:p)。