Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配父元素的子元素中的C#XmlSerializer xmlns_C#_Xml Namespaces_Xmlserializer_Ebay Lms - Fatal编程技术网

匹配父元素的子元素中的C#XmlSerializer xmlns

匹配父元素的子元素中的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

我正在使用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>
我创建了一个序列化程序

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=“”