如何删除每个集合的父元素并将其表示为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')"
}
我该怎么做?
在使用SerializeXmlNode
之前,您需要对XML进行一些操作,以便获得您想要的结果。
- 在
BPAddresses
元素中添加json:Array="true"
属性来发送Json信号。Net在转换为JSON时将该元素视为数组的一部分。(注意json:
属性前缀对应http://james.newtonking.com/projects/json
XML命名空间) - 将
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