我需要序列化一个XML,以便为APIPUT请求附加。
我使用的是System.Xml.Serialization。
最终结果需要类似于以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
<product>
<id>
<![CDATA[2678]]>
</id>
<cache_default_attribute>
<![CDATA[0]]>
</cache_default_attribute>
<id_shop_default>
<![CDATA[1]]>
</id_shop_default>
<reference>
<![CDATA[2678]]>
</reference>
<supplier_reference>
<![CDATA[]]>
</supplier_reference>
<location>
<![CDATA[]]>
</location>
<width>
<![CDATA[0.000000]]>
</width>
<height>
<![CDATA[0.000000]]>
</height>
<depth>
<![CDATA[0.000000]]>
</depth>
<weight>
<![CDATA[0.000000]]>
</weight>
<quantity_discount>
<![CDATA[0]]>
</quantity_discount>
<ean13>
<![CDATA[]]>
</ean13>
<isbn>
<![CDATA[]]>
</isbn>
<upc>
<![CDATA[0]]>
</upc>
<mpn>
<![CDATA[000.018]]>
</mpn>
<cache_is_pack>
<![CDATA[0]]>
</cache_is_pack>
<cache_has_attachments>
<![CDATA[0]]>
</cache_has_attachments>
<is_virtual>
<![CDATA[0]]>
</is_virtual>
<state>
<![CDATA[1]]>
</state>
<additional_delivery_times>
<![CDATA[1]]>
</additional_delivery_times>
<delivery_in_stock>
<language id="1">
<![CDATA[]]>
</language>
<language id="2">
<![CDATA[]]>
</language>
</delivery_in_stock>
<delivery_out_stock>
<language id="1">
<![CDATA[]]>
</language>
<language id="2">
<![CDATA[]]>
</language>
</delivery_out_stock>
<product_type>
<![CDATA[combinations]]>
</product_type>
<on_sale>
<![CDATA[0]]>
</on_sale>
<online_only>
<![CDATA[0]]>
</online_only>
<date_add>
<![CDATA[2023-02-16 00:21:12]]>
</date_add>
<date_upd>
<![CDATA[2023-02-22 17:22:23]]>
</date_upd>
<name>
<language id="1">
<![CDATA[ETNIES TRI LAM POLO (000.018)]]>
</language>
<language id="2">
<![CDATA[ETNIES TRI LAM POLO (000.018)]]>
</language>
</name>
</product>
</prestashop>
为此我有这样一个类:
[XmlType("product")]
public class Product
{
public Product()
{
id = "";
active = "1";
available_for_order= "1";
indexed= "1";
visibility = "both";
delivery_in_stock = new List<PaLanguage>();
delivery_out_stock = new List<PaLanguage>();
name = new List<PaLanguage>();
}
[XmlElement("id")] public XmlCDataSection C_id { get { return new XmlDocument().CreateCDataSection(id); } set { id = value.Value; } }
[XmlIgnore] public string id;
[XmlElement("cache_default_attribute")] public XmlCDataSection C_cache_default_attribute { get { return new XmlDocument().CreateCDataSection(cache_default_attribute); } set {cache_default_attribute = value.Value; } }
[XmlIgnore] public string cache_default_attribute;
...
[XmlArray("delivery_in_stock")] public List<PaLanguage> delivery_in_stock;
[XmlArray("delivery_out_stock")] public List<PaLanguage> delivery_out_stock;
...
PaLanguage为:
public class PaLanguage
{
[XmlElement("language")] public XmlCDataSection C_language { get { return new XmlDocument().CreateCDataSection(language); } set { language = value.Value; } }
[XmlIgnore] public string language { get; set; }
[XmlAttribute("id")] public string id;
}
因为这是在更新一条记录,所以我首先完成一个get请求,然后匹配它的所有值。
XDocument getResponse = Helper.GetProductReference(get, Helper.GetValueByKey("ShopApi") + "products/");
var gotProduct = getResponse
.Element("prestashop")
.Element("products")
.Elements("product")
.Where(e => e.Element("reference").Value == mtrl)
.Single();
我创建了一个新的Product项以附加到我的put请求,但在序列化它的XmlArrays时遇到了问题。
我尝试的最后一件事是:
foreach (XElement x in gotProduct.Element("delivery_in_stock").Elements("language"))
{
product.delivery_in_stock.Add(new PrestaLanguage { id = (string)x.Attribute("id"), language = (string)x.Element("language") });
}
这是完全错误的,因为它将其序列化为:
<product>
<id><![CDATA[2678]]></id>
... xml
<delivery_in_stock>
<PaLanguage id="1">
<language><![CDATA[]]></language>
</PaLanguage>
<PaLanguage id="2">
<language><![CDATA[]]></language>
</PaLanguage>
</delivery_in_stock>
这感觉就像我已经尝试了一切可以找到网上和官方文件,只有得到进一步从我的预期结果与每一次尝试。
我应该注意到这个类实际上还有几十个字段,它们要么都是字符串,要么都是id和语言值的另一种组合。
任何和所有的帮助是感激的。
3条答案
按热度按时间vdgimpew1#
XML中的delivery_in_stock和delivery_out_stock元素似乎可以包含具有不同id属性的多种语言元素,因此,需要修改foreach循环以处理多种语言元素。
除了使用Elements(“language”),您还可以使用Descendants(“language”)来获取delivery_in_stock和delivery_out_stock下的所有语言元素。
此外,在PaLanguage类中,language属性的类型应为XmlCDataSection,而不是string,因为它包含CDATA。
最后,对于产品类,应该将[XmlElement]属性添加到没有这些属性的属性中,例如id_shop_default、reference、supplier_reference等。
yxyvkwin2#
你能做的是用下面的PaLanguage替换你当前的PaLanguage,并尝试在你发现问题的所有字段上做同样的事情:
sg24os4d3#
我在正确的轨道上
首先,我将C_language更改为XmlNode[],其中getter和setter稍有不同
然后我还更改了Product中的列表
最后,正如塞巴斯蒂安建议的那样,我使用了后代而不是元素。
感谢所有帮忙的人。