2017-05-25 3 views
0

xmltocsharp siteを使用して特定のXMLを逆シリアル化するクラスヘルパーを作成しましたが、問題はルート要素にあります。これは、(RESP_HDRとRESP_BODYが崩壊した)ルート要素です:どのようにxmlns接頭辞は、ルート要素の逆シリアル化クラスで設定されます

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

そして、これは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; } 
} 

問題は、クラスのようなXMLをデシリアライズに失敗したということですこれで前に示したが、成功:

<?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> 

違いは、オブジェクトを作成し、それをシリアル化、これは結果になる場合でも、名前空間です。だから、元のXMLで動作させるために、クラス内で何を変更する必要がありますか?

UPDATE:私は本当に問題を発見したよく見る


は、まだルート要素であるが、私はヘルパーでそれを設定することができますどのように私は、ルートタグで行方不明のxmlns接頭辞に気づきますクラス?

EDIT:


これは、サービスの応答からのXMLのサンプルです:これまでのところ

<?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

XMLはどちらも同じです。彼らは同じ要素名と同じ名前空間を持っています。名前空間接頭辞は無関係です。 –

+0

まだ動作していませんが、これまでのところ、取得したXMLを変更し、接頭辞SIIをタグ 'RESPUESTA'に追加し、残りの名前空間を追加してから、このXMLを逆シリアル化します。 – Yasel

+0

「RESPUESTA」というタグからプレフィックスSIIを「削除」することを意味しました – Yasel

答えて

0

私はそれを動作させることができる唯一の方法は、本当に醜い溶液でありますこれは問題の答えとはみなされません!

//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>(); 

理想的なソリューションは、XMLレスポンスを取るなど任意の前処理せずに直接それをデシリアライズします:

//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>(); 

注:ParseXMLが@Damian's answer

+0

何をしていますか?私は繰り返すことができます:ネームスペース接頭辞はxmlパーサとデシリアライザには関係ありません。もちろん、それらがw3cに準拠している場合に限ります。標準の 'System.Xml.Serialization.XmlSerializer'はそれを完全に遵守し、両方のxmlを正しく解析します。 –

+0

私はちょうどあなたの答えに質問にもコメントを追加しました、あなたの注意に感謝します。 – Yasel

0

に基づいており、私はあなたのxmlを取っ:

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

私はクラスを受け取りました:

[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 { } 

空のクラススタブを2つ追加しました。

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); 

それは働きます!どうやってそれがあなたのために働かないのか分かりません。

+0

Petrov、デシリアライズしようとしてエラーが発生したことは一度も言われませんでしたが、結果は空のオブジェクトになります。サービス応答からXMLサンプルを追加しましたが、もう一度試してみてください。私はhttp://xmltocsharp.azurewebsites.net/でクラスを生成することを忘れないでください – Yasel

関連する問題