Wie kann ich eine XML-Datei in JSON konvertieren, wobei das Präfix "zs:" für jedes Element ignoriert wird?

<?xml version="1.0" encoding="UTF-8" ?>
 <zs:searchRetrieveResponse xmlns:zs="http://www.loc.gov/zing/srw/">
   <zs:version>1.1</zs:version>
   <zs:numberOfRecords>0</zs:numberOfRecords>
   <zs:echoedSearchRetrieveRequest>
       <zs:version>1.1</zs:version>
       <zs:query>dc.identifier="9780393051247"</zs:query>
       <zs:startRecord>1</zs:startRecord>
       <zs:maximumRecords>10</zs:maximumRecords>
       <zs:recordPacking>xml</zs:recordPacking>
       <zs:recordSchema>marcxml</zs:recordSchema>
   </zs:echoedSearchRetrieveRequest>
0
Andre Rubnikowich 18 Jän. 2019 im 02:38

3 Antworten

Beste Antwort

Sie können einen benutzerdefinierten JsonTextWriter verwenden.

public class CustomJsonWriter : JsonTextWriter
{
    public CustomJsonWriter(TextWriter writer): base(writer){}

    public override void WritePropertyName(string name)
    {
        base.WritePropertyName(name.Replace("zs:",string.Empty));
    }
}

Und dann

var xDocument = XDocument.Parse(xml);
var builder = new StringBuilder();
using(var writer = new StringWriter(builder))
{
    var serializer = JsonSerializer.Create();
    serializer.Serialize(new CustomJsonWriter(writer), xDocument);
}

Ausgabe

{
  "?xml": {
    "@version": "1.0",
    "@encoding": "UTF-8"
  },
  "searchRetrieveResponse": {
    "@xmlns:zs": "http://www.loc.gov/zing/srw/",
    "version": "1.1",
    "numberOfRecords": "0",
    "echoedSearchRetrieveRequest": {
      "version": "1.1",
      "query": "dc.identifier='9780393051247'",
      "startRecord": "1",
      "maximumRecords": "10",
      "recordPacking": "xml",
      "recordSchema": "marcxml"
    }
  }
}
3
Cubicle.Jockey 18 Jän. 2019 im 01:27

Json.Net verfügt hierfür über eine Bibliothek. Ich habe mit Ihrer XML in LinqPad.Net gespielt.

Dieser Code:

var xml = new StringBuilder();

xml.AppendLine("<?xml version = \"1.0\" encoding = \"UTF-8\"?>");
xml.AppendLine("<zs:searchRetrieveResponse xmlns:zs = \"http://www.loc.gov/zing/srw/\">");
xml.AppendLine("<zs:version>1.1</zs:version >");
xml.AppendLine("<zs:numberOfRecords>0</zs:numberOfRecords>");
xml.AppendLine("<zs:echoedSearchRetrieveRequest>");
xml.AppendLine("<zs:version>1.1</zs:version>");
xml.AppendLine("<zs:query>dc.identifier=\"9780393051247\"</zs:query>");
xml.AppendLine("<zs:startRecord>1</zs:startRecord>");
xml.AppendLine("<zs:maximumRecords>10</zs:maximumRecords>");
xml.AppendLine("<zs:recordPacking>xml</zs:recordPacking>");
xml.AppendLine("<zs:recordSchema>marcxml</zs:recordSchema>");
xml.AppendLine("</zs:echoedSearchRetrieveRequest>");
xml.AppendLine("</zs:searchRetrieveResponse>");

xml.Replace("zs:", string.Empty);
xml.Replace(":zs", string.Empty);


var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml.ToString());

var json = JsonConvert.SerializeXmlNode(xmlDoc);

json.Dump();

Erzeugt dieses Ergebnis:

{
   "?xml":{
      "@version":"1.0",
      "@encoding":"UTF-8"
   },
   "searchRetrieveResponse":{
      "@xmlns":"http://www.loc.gov/zing/srw/",
      "version":"1.1",
      "numberOfRecords":"0",
      "echoedSearchRetrieveRequest":{
         "version":"1.1",
         "query":"dc.identifier=\"9780393051247\"",
         "startRecord":"1",
         "maximumRecords":"10",
         "recordPacking":"xml",
         "recordSchema":"marcxml"
      }
   }
}
2
Cubicle.Jockey 17 Jän. 2019 im 23:57

Sie können den Namespace nicht einfach ignorieren - er ist ein integrales Element. Bitte verwenden Sie:

string xmlWithoutNamespace = yourXmlString.Replace("zs:", "");

Auf Ihrem XML-String und konvertieren Sie es dann in JSON.

1
Maciej S. 17 Jän. 2019 im 23:49