如何删除每个集合的父元素并将其表示为json中的数组

本文关键字:表示 数组 json 元素 删除 集合 何删除 | 更新日期: 2023-09-27 18:04:57

我有以下XML:

<Envelops
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
    <BusinessPartners>
        <CardCode>L10002</CardCode>
        <BPAddresses>
            <row>
                <AddressName>Bill To</AddressName>
                <AddressType>bo_BillTo</AddressType>
                <BPCode>L10002</BPCode>
                <U_WBCUSTADDID>84</U_WBCUSTADDID>
                <RowNum>0</RowNum>
            </row>
        </BPAddresses>
        <U_WBCUSTID>74</U_WBCUSTID>
        <UploadURL>BusinessPartners('L10002')</UploadURL>
    </BusinessPartners>
</Envelops>

我使用Json。使用以下代码将其序列化为JSON:

foreach (XmlNode data2 in d1.GetElementsByTagName("BusinessPartners"))
{
    var requestBody = JsonConvert.SerializeXmlNode(data2, Newtonsoft.Json.Formatting.Indented, true);            
}

我得到JSON格式如下:

{
  "CardCode": "L10002",
  "BPAddresses": {
    "row": {
      "AddressName": "Bill To",
      "AddressType": "bo_BillTo",
      "BPCode": "L10002",
      "U_WBCUSTADDID": "84",
      "RowNum": "0"
    }
  },
  "U_WBCUSTID": "74",
  "UploadURL": "BusinessPartners('L10002')"
}

我想实现的是这样的格式:

{
  "CardCode": "L10002",
  "BPAddresses": [{
      "AddressName": "Bill To",
      "AddressType": "bo_BillTo",
      "BPCode": "L10002",
      "U_WBCUSTADDID": "84",
      "RowNum": "0"
    }],
  "U_WBCUSTID": "74",
  "UploadURL": "BusinessPartners('L10002')"
}

我该怎么做?

如何删除每个集合的父元素并将其表示为json中的数组

在使用SerializeXmlNode之前,您需要对XML进行一些操作,以便获得您想要的结果。

  1. BPAddresses元素中添加json:Array="true"属性来发送Json信号。Net在转换为JSON时将该元素视为数组的一部分。(注意json:属性前缀对应http://james.newtonking.com/projects/json XML命名空间)
  2. row的子元素直接移动到BPAddresses。如果有多个row,那么为每行创建额外的BPAddresses元素,作为原始BPAddresses元素的兄弟元素。(确保每个新的BPAddresses元素也有json:Array="true"属性)

下面的代码应该可以满足您的需求:

foreach (XmlElement data2 in d1.GetElementsByTagName("BusinessPartners"))
{
    XmlElement bpa = (XmlElement)data2.SelectSingleNode("BPAddresses");
    XmlElement insertionPoint = bpa;
    foreach (XmlElement row in bpa.GetElementsByTagName("row"))
    {
        // Create a new BPAddresses element and add an Array="true" attribute to it 
        // so JSON.Net will know to treat it as an array
        XmlElement addr = d1.CreateElement("BPAddresses");
        XmlAttribute attr = d1.CreateAttribute("Array", "http://james.newtonking.com/projects/json");
        attr.Value = "true";
        addr.Attributes.Append(attr);
        // move all the children of the row element into the new BPAddresses element
        foreach (XmlElement child in row.GetElementsByTagName("*").Cast<XmlElement>().ToList())
        {
            addr.AppendChild(child);
        }
        // insert the new element after the last BPAddresses element
        data2.InsertAfter(addr, insertionPoint);
        insertionPoint = addr;
    }
    // remove the original BPAddresses element (and its children)
    data2.RemoveChild(bpa);
    var requestBody = JsonConvert.SerializeXmlNode(data2, Formatting.Indented, true);
    Console.WriteLine(requestBody);
}

小提琴:https://dotnetfiddle.net/ML0D6Z