将xml转换为json忽略元素前缀

时间:2019-01-17 23:38:35

标签: c# .net json xml

如何忽略每个元素的前缀“ zs:”将xml转换为json。

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

3 个答案:

答案 0 :(得分:1)

您不能只忽略命名空间-它是不可或缺的元素。请使用:

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

在您的xml字符串上,然后将其转换为json。

答案 1 :(得分:1)

Json.Net有一个用于此的库。我在LinqPad.Net中使用了您的xml。

此代码:

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

产生此结果:

{
   "?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 :(得分:1)

您可以使用自定义JsonTextWriter。

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

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

然后

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

输出

{
  "?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"
    }
  }
}