Добавление атрибута к элементу root элемента XML - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть класс, который добавляет атрибут ко всем другим элементам, кроме элемента root файла XML. C# Класс выглядит следующим образом

[XmlRoot(ElementName = "bd", Namespace = "http://www.fca.com/ifast")]
public class Bd
{
    [XmlElement(ElementName = "msg", Namespace = "http://www.fca.com/ifast")]
    public Msg Msg { get; set; }
}

[XmlRoot(ElementName = "tr", Namespace = "http://www.fca.com/ifast")]
public class Tr
{
    [XmlElement(ElementName = "hd", Namespace = "http://www.fca.com/ifast")]
    public Hd Hd { get; set; }
    [XmlElement(ElementName = "bd", Namespace = "http://www.fca.com/ifast")]
    public Bd Bd { get; set; }
    [XmlAttribute(AttributeName = "if", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string If { get; set; }
}

С помощью этого кода я могу создать файл XML, подобный этому

'<?xml version="1.0" encoding="utf-16"?>
<tr xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema 
instance" xmlns:if="http://www.fca.com/ifast" xmlns="http://www.fca.com/ifast">
<if:hd>    
</if:hd>
<if:bd>    
</if:bd>
</tr>'

Но мне нужно добавить элемент if: на root элемент, как это

<?xml version="1.0" encoding="utf-16"?>
<if:tr xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema 
instance" xmlns:if="http://www.fca.com/ifast" xmlns="http://www.fca.com/ifast">
<if:hd>    
</if:hd>
<if:bd>    
</if:bd>
</if:tr>

1 Ответ

0 голосов
/ 18 февраля 2020

Атрибут xmlns:if является объявлением пространства имен. Это специальные атрибуты, и их не следует указывать явно в качестве свойств, как вы это сделали здесь - сериализатор будет обрабатывать это за вас.

Я бы также отметил, что пространства имен наследуются от их родителей, поэтому большинство места, которые вы указали в пространстве имен, не обязательны. Вам также нужен только атрибут XmlRoot для root. Этого должно быть достаточно:

public class Bd
{
    [XmlElement("msg")]
    public Msg Msg { get; set; }
}

[XmlRoot("tr", Namespace = "http://www.fca.com/ifast")]
public class Tr
{
    [XmlElement("hd")]
    public Hd Hd { get; set; }
    [XmlElement("bd")]
    public Bd Bd { get; set; }
}

Два включенных вами бита XML семантически одинаковы, но если вы хотите контролировать префикс пространства имен, вы можете сделать это при сериализации:

var ns = new XmlSerializerNamespaces();
ns.Add("if", "http://www.fca.com/ifast");

var serializer = new XmlSerializer(typeof(Tr));

serializer.Serialize(stream, obj, ns);

См. эту скрипку для рабочего демо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...