And*_*osa 6 c# xml xml-serialization visual-studio-2010 xml-namespaces
我正在使用墨西哥税收计算程序,政府提供了以下XSD文件http://www.sat.gob.mx/cfd/3/cfdv32.xsd,xsd.exe帮助我将其转换为C#这个类很大,所以我只是提供一个链接,以便不会膨胀这篇文章的代码:http: //pastebin.com/r3VCgFMU.
填写一些类字段后(所以示例不会太大)我尝试按如下方式序列化XML:
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlNameSpace.Add("schemaLocation", "http://www.sat.gob.mx/cfd/3/cfdv32.xsd");
xmlNameSpace.Add("cfdi", "www.sat.gob.mx/cfd/3");
XmlTextWriter xmlTextWriter = new XmlTextWriter("c:\\temp\\pruebas.xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
XmlSerializer xs = new XmlSerializer(typeof(Comprobante));
xs.Serialize(xmlTextWriter, comprobante, xmlNameSpace);
xmlTextWriter.Close();
Run Code Online (Sandbox Code Playgroud)
这给了我这个输出:
<?xml version="1.0" encoding="utf-8"?>
<Comprobante xmlns:cfdi="www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schemaLocation="http://www.sat.gob.mx/cfd/3/cfdv32.xsd" version="3.2" fecha="0001-01-01T00:00:00" subTotal="0" total="0" tipoDeComprobante="ingreso" xmlns="http://www.sat.gob.mx/cfd/3">
<Emisor rfc="DERH9145202V4">
<DomicilioFiscal calle="Calle1" colonia="Colonia" municipio="municipio" estado="estado" pais="pais" codigoPostal="07000" />
<RegimenFiscal Regimen="Peque" />
</Emisor>
</Comprobante>
Run Code Online (Sandbox Code Playgroud)
正如我们在政府提供的示例中所看到的(ftp://ftp2.sat.gob.mx/asistencia_servicio_ftp/publicaciones/solcedi/ejemplo1%20cfdv3.xml),我生成的文件缺少一些要点:
<Comprobante... should be <cfdi:Comprobante
<Emisor.. should be <cfdi:Emisor
and so on and so forth with all elements...
xmlns:schemaLocation should be xsi:schemaLocation
I'm getting and additional xmlns="http://www.sat.gob.mx/cfd/3" at the end of the Comprobante declaration
Run Code Online (Sandbox Code Playgroud)
如何在xml中实现此更改?:d
MSDN工作人员解决了这个问题,如果有人有同样的问题,只需添加:
[XmlAttribute(Namespace = XmlSchema.InstanceNamespace)]
public string schemaLocation = "http://www.sat.gob.mx/cfd/3 cfdv32.xsd";
Run Code Online (Sandbox Code Playgroud)
要么是xsd.exe生成的根类,要么是部分类
(在这个例子中
public partial class Comprobante {
[XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)]
public string schemaLocation = "http://www.sat.gob.mx/cfd/3 cfdv32.xsd";
...
}
Run Code Online (Sandbox Code Playgroud)