簡體   English   中英

如何在反序列化類中為根元素設置xmlns前綴

[英]How set xmlns prefix in deserialization class for the root element

我使用xmltocsharp站點創建了用於反序列化特定XML的類幫助器,但是它不起作用,並且問題出在根元素中。 這是根元素(RESP_HDR和RESP_BODY已折疊):

<?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網站生成的根元素類:

[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一起使用?

更新:


仔細觀察,我發現真正的問題仍然在根元素中,但是我注意到根標記中缺少xmlns前綴,如何在幫助器類中進行設置?

編輯:


這是來自服務響應的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>jjdoe@gmail.com</MAIL_CEDENTE>
            <CESIONARIO>762327129-7</CESIONARIO>
            <RZ_CESIONARIO>capital sa</RZ_CESIONARIO>
            <MAIL_CESIONARIO>xcap@capital.com</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>jd@gmail.com</MAIL_CEDENTE>
            <CESIONARIO>762327129-7</CESIONARIO>
            <RZ_CESIONARIO>Capital S.A.</RZ_CESIONARIO>
            <MAIL_CESIONARIO>jcap@capital.com</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>

到目前為止,使它起作用的唯一方法是使用一個非常丑陋的解決方案, 這不應視為解決問題的方法!!

//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 的答案

我拿了你的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 { }

剛剛添加了兩個空的類存根。

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

有用! 我不明白它如何以及為什么對您不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM