2

こんにちは私はそのような3つのクラスを持っています:

public abstract class XmlNs
{
    public const string XmlnsAttribute = "urn:ebay:apis:eBLBaseComponents";
}


[Serializable]
public class BulkDataExchangeRequests : XmlNs
{
    [XmlAttribute("xmlns")]
    public string XmlNs = XmlnsAttribute;
    [XmlElement("Header")]
    public Header Header { get; set; }
    [XmlElement("AddFixedPriceItemRequest")]
    public List<AddFixedPriceItemRequest> ListAddFixedPriceItemRequest { get; set; }
}

[Serializable]
public class AddFixedPriceItemRequest : XmlNs
{
    [XmlElement("ErrorLanguage")]
    public string ErrorLanguage { get; set; }
    [XmlElement("WarningLevel")]
    public string WarningLevel { get; set; }
    [XmlElement("Version")]
    public string Version { get; set; }
    [XmlElement("Item")]
    public ItemType Item { get; set; }
    [XmlAttribute("xmlns")]
    public string XmlNs = XmlnsAttribute;
}

問題は、オブジェクトをシリアル化すると、正しい xml が取得されますが、AddFixedPriceItemRequest アイテムに xmlns 属性がなく、BulkDataExchangeRequests では xmlns が正しく記述されていることです....

どんな助けでも大歓迎です...

4

1 に答える 1

2

要素をネストしており、他に何も指定しない場合、ネストされた要素は親要素と同じ名前空間にあります。したがって、実際には、シリアライザーは必要ないため、属性を再度出力しないことが正しいです。xmlns

見る:

<root xmlns="my-namespace">
    <element>this is also in the namespace "my-namespace" without further declaration</element>
    <so><are><child><elements></elements></child></are></so>
</root>


編集: eBay は明らかに標準に準拠していませんが、解決策があります。.NET xml シリアライザーの名前空間を非常に便利な方法で宣言できます。これらの宣言は、繰り返されても保持されます。

[Serializable]
public class BulkDataExchangeRequests : XmlNs
{
    [XmlElement("Header")]
    public Header Header { get; set; }
    [XmlElement("AddFixedPriceItemRequest")]
    public List<AddFixedPriceItemRequest> ListAddFixedPriceItemRequest { get; set; }

    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new System.Xml.XmlQualifiedName[] { new System.Xml.XmlQualifiedName("", XmlnsAttribute) });
}

[Serializable]
public class AddFixedPriceItemRequest : XmlNs
{
    [XmlElement("ErrorLanguage")]
    public string ErrorLanguage { get; set; }
    [XmlElement("WarningLevel")]
    public string WarningLevel { get; set; }
    [XmlElement("Version")]
    public string Version { get; set; }
    [XmlElement("Item")]
    public ItemType Item { get; set; }

    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new System.Xml.XmlQualifiedName[] { new System.Xml.XmlQualifiedName("", XmlnsAttribute) });
}

出力は期待どおりです。

<?xml version="1.0" encoding="utf-16"?>
<BulkDataExchangeRequests xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:ebay:apis:eBLBaseComponents">
  <AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents" />
  <AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents" />
</BulkDataExchangeRequests>

関連ドキュメント:

System.Xml.Serialization.XmlNamespaceDeclarations System.Xml.Serialization.XmlSerializerNamespaces

于 2013-07-30T12:34:30.183 に答える