1

我正在使用 XmlSerializer 创建一个用于 ebay 的大型商家服务的 xml 文档。

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

我遇到的问题是让序列化程序生成的 AddFixedPriceItemRequest 实际上包含像 BulkDataExchangeRequests 元素一样的 xmlns。为了使它起作用,这似乎是一个要求。我使用以下方法生成批量标签:

writer.WriteStartElement("BulkDataExchangeRequests", "urn:ebay:apis:eBLBaseComponents");

我创建了一个序列化程序。

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

有人可以帮助解决如何通过序列化程序设置 addfixedpriceitemrequest 的 xmlns 以匹配批量 xmlns。或者推荐另一种方法。我试图避免用 createelement/writeelement 写出每个属性。

4

3 回答 3

1

这对我行得通


 ItemType itemType = new ItemType()
 {
     //populate data.
 };
 ApiCall apiCall = new AddItemCall() { Item = itemType };
 AddItemRequestType addFixedPriceItemRequestType = ((AddItemCall)apiCall).ApiRequest;
 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] {
     new XmlQualifiedName(string.Empty, "urn:ebay:apis:eBLBaseComponents")});
 XmlSerializer xmlSerializer = new XmlSerializer(
     addFixedPriceItemRequestType.GetType(), "urn:ebay:apis:eBLBaseComponents");
 MemoryStream memoryStream = new MemoryStream();
 xmlSerializer.Serialize(memoryStream, addFixedPriceItemRequestType , namespaces);
 memoryStream.Seek((long)0, SeekOrigin.Begin);
 XmlDocument xmlDocument = new XmlDocument();
 xmlDocument.Load(memoryStream);
 memoryStream.Close();
 string addItemRequestTypeXML = xmlDocument.OuterXml;

输出将是:


 <AddItemRequestType xmlns="urn:ebay:apis:eBLBaseComponents">
  <Item>
    <ApplicationData></ApplicationData>
    <AutoPay>false</AutoPay>
    <CategoryMappingAllowed>true</CategoryMappingAllowed>
    <Country>US</Country>
    <Currency>EUR</Currency>
    <Description>
    ....

 <AddItemRequestType>
于 2014-02-27T06:37:58.003 回答
0

问题很可能在于XmlTypeAttribute- 您似乎将您的类用作顶级容器 - 您应该使用XmlRootAttributeinsted. 这样,您将被urn:ebay:apis:eBLBaseComponents放置在正确的位置。

样本:

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>

如果你修复属性:

[System.Xml.Serialization.XmlRootAttribute(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" xmlns="urn:ebay:apis:eBLBaseComponents">
  <FieldOfB>
    <C>5</C>
  </FieldOfB>
</A>
于 2013-12-14T18:44:21.863 回答
0

eBay 仅需要在 Trade API 中设置命名空间。一种解决方案是删除 BulkDataExchange 对象中的命名空间设置,并仅在 Trade API 对象中添加命名空间设置。这不是标准的 XML 格式,但 eBay 只接受这种格式。

在您的情况下,这可能会对 eBay 起到作用:

writer.WriteStartElement("BulkDataExchangeRequests", "");
于 2014-07-02T23:21:44.997 回答