2017-03-24 1 views
1

Ich arbeite an einem Dienst, in dem ich eine JSON-Anfrage übergebe, ich muss sie in XML konvertieren und sie mit einigen XML-Schemas vergleichen und dann etwas damit machen.Problembehandlung bei der Konvertierung von JSON in XML in C#

Mein Problem ist mit den Attributen. Zum Beispiel ist meine JSON Anfrage:

{ 
"BookingSearch_IN": { 
"MsgHeader": {  
    "MessageID": "ABC010101", 
    "ContextRecord": { 
    "ContextInfo": { 
     "ItineraryDetails": { 
     "ItinerarySeqNmbr": "1", 
     "StartDate": "2017-04-01", 
     "EndDate": "2017-04-14",    
     "LocationStart": { 
      "LocationContext": "AIRPORT", 
      "LocationCode": "MIA" 
     }, 
     "LocationEnd": { 
      "LocationContext": "AIRPORT", 
      "LocationCode": "MIA" 
     } 
     }, 
     "ExtraInfoList": { 
     "ExtraInfo": { 
      "Category": "CRUISE", 
      "Item": { 
      "Code": "SHIP_CODE", 
      "Value": "MAGIC" 
      } 
     } 
     }, 
     "_ResType": "Vacation" 
    } 
    } 
}, 
"_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", 
"_xmlns:cs": "http://MyCompany.com", 
"_version": "6.66", 
"__prefix": "cs" 
    } 
} 

Ich verwende: XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonObject);, um es zu XML zu konvertieren. Das Ergebnis ist, xml:

<BookingSearch_IN> 
<MsgHeader> 
    <MessageID>ABC010101</MessageID> 
     <ContextRecord> 
      <ContextInfo> 
       <ItineraryDetails> 
        <ItinerarySeqNmbr>1</ItinerarySeqNmbr> 
        <StartDate>2017-04-01</StartDate> 
        <EndDate>2017-04-14</EndDate>      
        <LocationStart> 
         <LocationContext>AIRPORT</LocationContext> 
         <LocationCode>MIA</LocationCode> 
        </LocationStart> 
        <LocationEnd> 
         <LocationContext>AIRPORT</LocationContext> 
         <LocationCode>MIA</LocationCode> 
        </LocationEnd> 
       </ItineraryDetails> 
       <ExtraInfoList> 
        <ExtraInfo> 
        <Category>CRUISE</Category> 
        <Item> 
         <Code>SHIP_CODE</Code> 
         <Value>MAGIC</Value> 
        </Item> 
        </ExtraInfo> 
       </ExtraInfoList> 
       <_ResType>Vacation</_ResType> 
      </ContextInfo> 
     </ContextRecord> 
</MsgHeader> 
<xsi>http://www.w3.org/2001/XMLSchema-instance</xsi><cs>http://MyCompany.com</cs><_version>6.66</_version><__prefix>cs</__prefix> 
</BookingSearch_IN> 

Das Ergebnis XML am Ende des Dokuments die Attribute des Wurzelelements hat als weitere Elemente (between </MsgHeader> and </BookingSearch_IN>). Mein Problem ist, dass der Dienst, der diese XML gegen die XML anderer Kunden validiert, diese Attribute im Stammelement überprüft. Hier ist, wie der Code der XML sein erwartet:

<?xml version="1.0" encoding="UTF-8"?> 
<cs:BookingSearch_IN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cs="http://MyCompany.com" version="6.66"> 
    <MsgHeader> 
     <MessageID>ABC010101</MessageID> 
     <ContextRecord> 
      <ContextInfo ResType="Vacation"> 
       <ItineraryDetails> 
        <ItinerarySeqNmbr>1</ItinerarySeqNmbr> 
        <StartDate>2017-04-01</StartDate> 
        <EndDate>2017-04-14</EndDate>      
        <LocationStart> 
         <LocationContext>AIRPORT</LocationContext> 
         <LocationCode>MIA</LocationCode> 
        </LocationStart> 
        <LocationEnd> 
         <LocationContext>AIRPORT</LocationContext> 
         <LocationCode>MIA</LocationCode> 
        </LocationEnd> 
       </ItineraryDetails> 
       <ExtraInfoList> 
        <ExtraInfo> 
         <Category>CRUISE</Category> 
         <Item> 
          <Code>SHIP_CODE</Code> 
          <Value>MAGIC</Value> 
         </Item>  
        </ExtraInfo> 
       </ExtraInfoList> 
      </ContextInfo>   
     </ContextRecord> 
    </MsgHeader>   
</cs:BookingSearch_IN> 

Der Code nicht

, weil es das Wurzelelement erwartet <cs:BookingSearch_IN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cs="http://MyCompany.com" version="5.22">

sein .... Jede beraten darüber, wie mit dieser Situation umgehen? oder wie man diese Attribute dahin zurückbringt, wo sie in das Wurzelelement gehören?

Antwort

2

NewtonSoft erwartet, dass Attribute mit @, nicht _ oder __ vorangestellt werden, und erwartet, dass Präfixe nur in die Namen eingefügt werden. Zum Beispiel, wenn Sie Ihre JSON sehen wie folgt zu erreichen:

{ 
    "cs:BookingSearch_IN": { 
     "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", 
     "@xmlns:cs": "http://MyCompany.com", 
     "@version": "6.66", 
     "MsgHeader": { 
      "MessageID": "ABC010101", 
      "ContextRecord": { 
       "ContextInfo": { 
        "@ResType": "Vacation", 
        "ItineraryDetails": { 
         "ItinerarySeqNmbr": "1", 
         "StartDate": "2017-04-01", 
         "EndDate": "2017-04-14", 
         "LocationStart": { 
          "LocationContext": "AIRPORT", 
          "LocationCode": "MIA" 
         }, 
         "LocationEnd": { 
          "LocationContext": "AIRPORT", 
          "LocationCode": "MIA" 
         } 
        }, 
        "ExtraInfoList": { 
         "ExtraInfo": { 
          "Category": "CRUISE", 
          "Item": { 
           "Code": "SHIP_CODE", 
           "Value": "MAGIC" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Es korrekt funktionieren (beachten Sie, dass Sie an die Spitze dieser XMLNS des bewegen up - wenn sie bleiben, wo sie am Boden sind, ist es löscht das Präfix aus irgendeinem Grund).

Wenn das nicht möglich ist, müssen Sie entweder einen anderen Serializer verwenden oder eine benutzerdefinierte Logik schreiben, um Ihren JSON oder XML vor-/nachzuverarbeiten.

+0

Da ich meinen Code testen musste, googelte ich einige Online-Tools, um mein XML-Beispiel in JSON zu konvertieren und zu sehen, ob es funktioniert. Ich habe herausgefunden, dass es keine "normale" Möglichkeit gibt, XML im JSON-Format darzustellen. Eine der Websites konvertierte mein XML in JSON mit den Attributen genauso wie die Antwort, direkt nach dem Element, aber mit dem Präfix "_". Ich denke, ich kann das Online-Tool verwenden und ersetzen Sie einfach das "_" für "@". Ich wusste nicht NewtonSoft erwartet "@" für die Attribute. Deine Antwort hat mein Problem gelöst ... danke für die Info! –

+0

Ich möchte sagen, dass 'DataContractJsonSerializer' die' _'s verwendet ... Aber ja, es gibt keinen Standard, jeder Serializer hat seine eigene Methode. –

Verwandte Themen