2017-05-25 2 views
0

Ich habe xmltocsharp site verwendet, um den Klassenhelfer zum Deserialisieren eines bestimmten XML zu erstellen, aber nicht funktioniert, und das Problem liegt im Stammelement. Dies ist das Wurzelelement (RESP_HDR und RESP_BODY zusammengebrochen wurden):Wie festgelegt Xmlns-Präfix in Deserialisierungsklasse für das Stammelement

<?xml version="1.0" encoding="UTF-8"?> 
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema"> 
    + <SII:RESP_HDR> 
    + <SII:RESP_BODY> 
</SII:RESPUESTA> 

Und das ist die Klasse Wurzelelement erzeugt durch xmltocsharp site:

[XmlRoot(ElementName = "RESPUESTA", Namespace = "http://www.sii.cl/XMLSchema")] 
public class RESPUESTA 
{ 
    [XmlElement(ElementName = "RESP_HDR", Namespace = "http://www.sii.cl/XMLSchema")] 
    public RESP_HDR RESP_HDR { get; set; } 
    [XmlElement(ElementName = "RESP_BODY", Namespace = "http://www.sii.cl/XMLSchema")] 
    public RESP_BODY RESP_BODY { get; set; } 
    [XmlAttribute(AttributeName = "SII", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string SII { get; set; } 
} 

Das Problem ist, dass die Klasse eines XML deserialisiert nicht wie die zuvor zeigte, aber der Erfolg mit diesem:

<?xml version="1.0" encoding="UTF-8"?> 
<RESPUESTA xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SII="http://www.sii.cl/XMLSchema" xmlns="http://www.sii.cl/XMLSchema"> 
    + <SII:RESP_HDR> 
    + <SII:RESP_BODY> 
</RESPUESTA> 

der Unterschied liegt in der Namespaces, auch wenn ein das Objekt erstellen und serialisiert sie, wird dies die Folge sein. Was sollte in der Klasse geändert werden, damit sie mit dem ursprünglichen XML funktioniert?

UPDATE:


näheres Hinsehen ich das wirklich Problem gefunden wird, ist in dem Wurzelelement immer noch, aber ich merke, den fehlenden Präfix xmlns im Root-Tag, wie kann ich es im Helfer gesetzt Klasse?

EDIT:


Dies ist eine XML-Probe aus der Service-Antwort:

<?xml version="1.0" encoding="UTF-8"?> 
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema"> 
    <SII:RESP_HDR> 
     <SII:ESTADO>0</SII:ESTADO> 
     <SII:GLOSA/> 
    </SII:RESP_HDR> 
    <SII:RESP_BODY> 
     <DATOS_CONSULTA> 
      <RUT>80182144-3</RUT> 
      <TIPO_CONSULTA>DEUDOR</TIPO_CONSULTA> 
      <DESDE_DDMMAAAA>01042017</DESDE_DDMMAAAA> 
      <HASTA_DDMMAAAA>01052017</HASTA_DDMMAAAA> 
     </DATOS_CONSULTA> 
     <CESION> 
      <VENDEDOR>11455447-9</VENDEDOR> 
      <ESTADO_CESION>Cesion Vigente</ESTADO_CESION> 
      <DEUDOR>80182144-3</DEUDOR> 
      <MAIL_DEUDOR/> 
      <TIPO_DOC>33</TIPO_DOC> 
      <NOMBRE_DOC>Factura Electronica</NOMBRE_DOC> 
      <FOLIO_DOC>107</FOLIO_DOC> 
      <FCH_EMIS_DTE>2017-04-04</FCH_EMIS_DTE> 
      <MNT_TOTAL>3324860</MNT_TOTAL> 
      <CEDENTE>11455447-9</CEDENTE> 
      <RZ_CEDENTE>JHON DOE</RZ_CEDENTE> 
      <MAIL_CEDENTE>[email protected]</MAIL_CEDENTE> 
      <CESIONARIO>762327129-7</CESIONARIO> 
      <RZ_CESIONARIO>capital sa</RZ_CESIONARIO> 
      <MAIL_CESIONARIO>[email protected]</MAIL_CESIONARIO> 
      <FCH_CESION>2017-04-05 13:15</FCH_CESION> 
      <MNT_CESION>3324860</MNT_CESION> 
      <FCH_VENCIMIENTO>2017-06-04</FCH_VENCIMIENTO> 
     </CESION> 
     <CESION> 
      <VENDEDOR>11455447-9</VENDEDOR> 
      <ESTADO_CESION>Cesion Vigente</ESTADO_CESION> 
      <DEUDOR>80182144-3</DEUDOR> 
      <MAIL_DEUDOR/> 
      <TIPO_DOC>33</TIPO_DOC> 
      <NOMBRE_DOC>Factura Electronica</NOMBRE_DOC> 
      <FOLIO_DOC>34</FOLIO_DOC> 
      <FCH_EMIS_DTE>2017-03-01</FCH_EMIS_DTE> 
      <MNT_TOTAL>1725500</MNT_TOTAL> 
      <CEDENTE>11455447-9</CEDENTE> 
      <RZ_CEDENTE>JOE DOE</RZ_CEDENTE> 
      <MAIL_CEDENTE>[email protected]</MAIL_CEDENTE> 
      <CESIONARIO>762327129-7</CESIONARIO> 
      <RZ_CESIONARIO>Capital S.A.</RZ_CESIONARIO> 
      <MAIL_CESIONARIO>[email protected]</MAIL_CESIONARIO> 
      <FCH_CESION>2017-04-05 17:27</FCH_CESION> 
      <MNT_CESION>1725500</MNT_CESION> 
      <FCH_VENCIMIENTO>2017-03-01</FCH_VENCIMIENTO> 
     </CESION> 
    </SII:RESP_BODY> 
</SII:RESPUESTA> 
+0

Beide XML sind identisch. Sie haben die gleichen Elementnamen und die gleichen Namensräume. Die Namespacepräfixe sind irrelevant. –

+0

Funktioniert immer noch nicht, der einzige Weg, bis ich es schaffen kann, ist das modifizierte XML zu modifizieren, das Präfix SII zum Tag 'RESPUESTA' hinzuzufügen und den Rest der Namespaces hinzuzufügen, dann dieses XML zu deserialisieren. – Yasel

+0

Ich meinte "entferne" das Präfix SII vom Tag 'RESPUESTA' – Yasel

Antwort

0

Bisher ist der einzige Weg, dass ich es Arbeit machen kann mit einer wirklich hässlichen Lösung ist, dies sollte nicht als eine antwort auf das problem betrachtet werden !!.

//Query service to obtain XML response 
string xmlResponse = siiClient.QueryDocuments(documentsRequest); 

//Replace RESPUESTA tags in the XML response, remove the prefix SII 
var replacedXML = xmlResponse .Replace("SII:RESPUESTA", "RESPUESTA"); 

//Load XML string into XmlDocument 
XmlDocument xDoc = new XmlDocument(); 
xDoc.LoadXml(replacedXML); 

//Add missing namespaces 
xDoc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
xDoc.DocumentElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); 
xDoc.DocumentElement.SetAttribute("xmlns", "http://www.sii.cl/XMLSchema"); 

//Now deserialization will work 
var documentResponse = xDoc.ParseXML<RESPUESTA>(); 

Die ideale Lösung wird die XML-Antwort nehmen und sie direkt ohne Vorverarbeitung deserialisieren wie:

//Query service to obtain XML response 
string xmlResponse = siiClient.QueryDocuments(documentsRequest); 

//ParseXML is an extension method, it can handle an string or an XmlDocument 
var documentResponse = xmlResponse.ParseXML<RESPUESTA>(); 

Hinweis: parseXML auf @Damian's answer basiert

+0

Was machst du zur Hölle? Ich kann nur wiederholen: das Namespacepräfix spielt keine Rolle für die XML-Parser und Deserializer. Natürlich vorausgesetzt, dass sie dem w3c entsprechen. Der Standard 'System.Xml.Serialization.XmlSerializer' passt ihn vollständig an und analysiert beide XML korrekt. –

+0

Ich habe nur weitere Details zu der Frage und auch einen Kommentar zu Ihrer Antwort hinzugefügt, danke für Ihre Aufmerksamkeit. – Yasel

0

ich Ihre xml nahm:

<?xml version="1.0" encoding="UTF-8"?> 
<SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema"> 
    <SII:RESP_HDR/> 
    <SII:RESP_BODY/> 
</SII:RESPUESTA> 

Ich nahm Sie Klasse:

[XmlRoot(ElementName = "RESPUESTA", Namespace = "http://www.sii.cl/XMLSchema")] 
public class RESPUESTA 
{ 
    [XmlElement(ElementName = "RESP_HDR", Namespace = "http://www.sii.cl/XMLSchema")] 
    public RESP_HDR RESP_HDR { get; set; } 
    [XmlElement(ElementName = "RESP_BODY", Namespace = "http://www.sii.cl/XMLSchema")] 
    public RESP_BODY RESP_BODY { get; set; } 
    [XmlAttribute(AttributeName = "SII", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string SII { get; set; } 
} 
public class RESP_HDR { } 
public class RESP_BODY { } 

Gerade zwei leere Klasse Stub hinzugefügt.

Versuchen System.Xml.Serialization.XmlSerializer:

RESPUESTA respuesta; 

var xs = new XmlSerializer(typeof(RESPUESTA)); 

using (var fs = new FileStream("test.xml", FileMode.Open)) 
    respuesta = (RESPUESTA)xs.Deserialize(fs); 

Es funktioniert! Ich verstehe nicht, wie und warum es nicht für dich funktioniert.

+0

Petrov, ich erwähnte nie einen Fehler beim Deserialisieren, ist nur, dass das Ergebnis ein leeres Objekt ist, genau wie das, das Sie bekommen. Ich habe ein XML-Beispiel aus der Serviceantwort hinzugefügt, vielleicht können Sie es noch einmal versuchen. Denken Sie daran, dass ich die Klasse in http://xmltocsharp.azurewebsites.net/ erzeuge – Yasel

Verwandte Themen