Первым шагом проекта, над которым я работаю, является создание файла XML
из списка записей. Раньше он был написан на java
, но я переношу его на C#
. В java они делали это, явно записывая каждую строку, и я пытаюсь включить способ сделать это программно, чтобы значения можно было изменить на более поздних этапах развертывания.
Файл, который я должен реплицировать, имеет имя заголовка с идентификатором списка заголовков: «inventory».
У меня просто нормально пишется "заголовок", но я не могу понять, как включить остальные.
[Serializable()]
[DesignerCategory("code")]
[XmlType(AnonymousType = false, Namespace = "http://www.demandware.com/xml/impex/inventory/2007-05-31")]
[XmlRoot(Namespace = "http://www.demandware.com/xml/impex/inventory/2007-05-31", IsNullable = false)]
public partial class inventory
{
private inventoryInventorylist inventorylistField;
[XmlElement("inventory-list")]
public inventoryInventorylist inventorylist
{
get
{
return inventorylistField;
}
set
{
inventorylistField = value;
}
}
}
[Serializable()]
[DesignerCategory("code")]
[XmlType(AnonymousType = true, TypeName = "inventory-list")]
public partial class inventoryInventorylist
{
public inventoryInventorylistHeader header;
private inventoryInventorylistHeader headerField
{
get
{
return header;
}
set
{
header = value;
}
}
}
[Serializable()]
[DesignerCategory("code")]
[XmlType(AnonymousType = false, TypeName = "header")]
public partial class inventoryInventorylistHeader
{
[XmlElement("default-instock")]
public bool defaultinstock
{
get
{
return defaultinstockField;
}
set
{
defaultinstockField = false;
}
}
[XmlElement("description")]
public string description
{
get
{
return descriptionField;
}
set
{
descriptionField = "Inventory";
}
}
[XmlElement("use-bundle-inventory-only")]
public bool usebundleinventoryonly
{
get
{
return usebundleinventoryonlyField;
}
set
{
usebundleinventoryonlyField = false;
}
}
[XmlElement("on-order")]
public bool onorder
{
get
{
return onorderField;
}
set
{
onorderField = false;
}
}
}
Создание:
var inventory = new inventory()
{
inventorylist = new inventoryInventorylist()
{
header = new inventoryInventorylistHeader()
{
defaultinstock = false,
description = "Inventory",
usebundleinventoryonly = false,
onorder = false
}
}
}
Возвращает это:
<inventory xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns = "http://www.demandware.com/xml/impex/inventory/2007-05-31">
<inventory-list>
<header>
<default-instock>false</default-instock>
<description>Inventory</description>
<use-bundle-inventory-only>false</use-bundle-inventory-only>
<on-order>false</on-order>
</header>
Я хочу, чтобы он вернул это:
<inventory xmlns = "http://www.demandware.com/xml/impex/inventory/2007-05-31">
<inventory-list>
<header list-id = "inventory">
<default-instock>false</default-instock>
<description>Inventory</description>
<use-bundle-inventory-only>false</use-bundle-inventory-only>
<on-order>false</on-order>
</header>
Если я напишу это в модели:
public partial class inventoryInventorylist
{
[XmlElement("header list-id:\"inventory\"")]
public inventoryInventorylistHeader header;
Затем он меняется на это:
<inventory-list>
<header_x0020_list-id_x003A__x0022_inventory_x0022_>
<default-instock>false</default-instock>
<description>Inventory</description>
<use-bundle-inventory-only>false</use-bundle-inventory-only>
<on-order>false</on-order>
</header_x0020_list-id_x003A__x0022_inventory_x0022_>
Как заставить его отображать нужный текст при сериализации модели?
Для этого вы можете использовать атрибут XmlAttribute. Если вы добавите
[XmlAttribute("list-id")]
public string listid
{
get;
set;
}
в свой класс inventoryInventorylistHeader вы получите xml, как описано в вашем вопросе.
Что я обычно делаю, так это беру xml и генерирую xsd с помощью Visual Studio. Затем я открою командную строку vs developer и использую xsd.exe для создания классов. Затем их можно немного отрефакторить, чтобы они лучше выглядели в коде.
Ах, спасибо! Это сработало. Ваш метод звучит лучше, чем то, что сделал я, который заключался в импорте xsd, которому должен соответствовать файл. Еще раз спасибо.
Когда вы используете [XmlElement()], создается один тег xml. Чтобы создать два тега для одного свойства класса С#, вы должны иметь объект массива или списка :public inventoryInventorylistHeader[] header; Предшествует [XmlArray("inventory")] и [XmlArrayItem("inventory-list"]