匹配父元素的子元素中的C#XmlSerializer xmlns
我正在使用XmlSerializer创建一个用于ebay大型商户服务的xml文档匹配父元素的子元素中的C#XmlSerializer xmlns,c#,xml-namespaces,xmlserializer,ebay-lms,C#,Xml Namespaces,Xmlserializer,Ebay Lms,我正在使用XmlSerializer创建一个用于ebay大型商户服务的xml文档 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents"> <Header> <SiteID>0</SiteID> <Vers
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<SiteID>0</SiteID>
<Version>775</Version>
</Header>
<AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<Version>775</Version>
<Item>
<AutoPay>false</AutoPay>
<BuyerProtection>ItemIneligible</BuyerProtection>
<BuyItNowPrice currencyID="USD">0.0</BuyItNowPrice>
<Country>US</Country>
<Currency>USD</Currency>
<Description>test</Description>
<GiftIcon>0</GiftIcon>
</Item>
</AddFixedPriceItemRequest>
</BulkDataExchangeRequests>
我创建了一个序列化程序
serializer = new XmlSerializer(typeof(AddFixedPriceItemRequestType));//, "urn:ebay:apis:eBLBaseComponents");
并使用名称空间序列化
request = new AddFixedPriceItemRequestType()
{
//populate data.
};
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "urn:ebay:apis:eBLBaseComponents");
serializer.Serialize(writer, request, namespaces);
这是具有xml属性的类型:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.5420")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:apis:eBLBaseComponents",TypeName="AddFixedPriceItemRequest")]
public partial class AddFixedPriceItemRequestType : AbstractRequestType {
//filled in class
}
我的输出结果如下:
<AddFixedPriceItemRequest xmlns="">
<ErrorLanguage xmlns="urn:ebay:apis:eBLBaseComponents">en_US</ErrorLanguage>
<Version xmlns="urn:ebay:apis:eBLBaseComponents">837</Version>
<Item p4:type="Item" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:ebay:apis:eBLBaseComponents">
恩努斯
837
是否有人可以帮助您通过序列化程序获取addfixedpriceitemrequest的xmlns集以匹配批量xmlns。或者推荐另一种方法。我试图避免使用createelement/writeelement写出每个属性。问题很可能在于
XmlTypeAttribute
-似乎您使用类作为顶级容器-您应该使用XmlRootAttribute
。这样,您就可以将urn:ebay:api:eblbase组件
放置在正确的位置
样本:
void Main()
{
var t = new A {FieldOfB = new B {C = 5}};
var serializer = new XmlSerializer(typeof(A));
using (var writer = new StringWriter())
{
serializer.Serialize(writer, t);
writer.ToString().Dump();
}
}
与此类定义一起使用时:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:apis:eBLBaseComponents")]
public class A
{
public B FieldOfB {get;set;}
}
public class B
{
public int C {get;set;}
}
产生以下结果:
<?xml version="1.0" encoding="utf-16"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FieldOfB xmlns="urn:ebay:apis:eBLBaseComponents">
<C>5</C>
</FieldOfB>
</A>
你得到这个:
<?xml version="1.0" encoding="utf-16"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:ebay:apis:eBLBaseComponents">
<FieldOfB>
<C>5</C>
</FieldOfB>
</A>
5.
问题最有可能在于XmlTypeAttribute
-似乎您使用类作为顶级容器-您应该使用XmlRootAttribute
。这样,您就可以将urn:ebay:api:eblbase组件
放置在正确的位置
样本:
void Main()
{
var t = new A {FieldOfB = new B {C = 5}};
var serializer = new XmlSerializer(typeof(A));
using (var writer = new StringWriter())
{
serializer.Serialize(writer, t);
writer.ToString().Dump();
}
}
与此类定义一起使用时:
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:apis:eBLBaseComponents")]
public class A
{
public B FieldOfB {get;set;}
}
public class B
{
public int C {get;set;}
}
产生以下结果:
<?xml version="1.0" encoding="utf-16"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FieldOfB xmlns="urn:ebay:apis:eBLBaseComponents">
<C>5</C>
</FieldOfB>
</A>
你得到这个:
<?xml version="1.0" encoding="utf-16"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:ebay:apis:eBLBaseComponents">
<FieldOfB>
<C>5</C>
</FieldOfB>
</A>
5.
对我有效
输出将是:
假的
真的
美国
欧元
....
对我有效
输出将是:
假的
真的
美国
欧元
....
易趣仅要求在交易API中设置命名空间。一种解决方案是删除BulkDataExchange对象中的命名空间设置,并仅在TradeAPI对象中添加命名空间设置。这不是标准的XML格式,但是易趣只接受这种格式
在您的情况下,这可能会对易趣产生影响:
writer.WriteStartElement("BulkDataExchangeRequests", "");
eBay仅要求在Trade API中设置命名空间。一种解决方案是删除BulkDataExchange对象中的命名空间设置,并仅在TradeAPI对象中添加命名空间设置。这不是标准的XML格式,但是易趣只接受这种格式 在您的情况下,这可能会对易趣产生影响:
writer.WriteStartElement("BulkDataExchangeRequests", "");
是否确实需要在
AddFixedPriceItemRequest
级别重新定义xmlns
?它已在BulkDataExchangeRequests
中定义,应正确继承。但绝对不应将其重新定义为xmlns=”“
您确定需要在AddFixedPriceItemRequest
级别重新定义xmlns
?它已在BulkDataExchangeRequests
中定义,应正确继承。但它绝对不应该被重新定义为xmlns=“”