Как добавить атрибут xsi:type к элементу XML

#c# #xml #xml-serialization

#c# #xml #xml-сериализация

Вопрос:

Как я могу добавить xsi: type в элемент xml.

Я пишу процедуру на C #, которая сериализует XML-файл с помощью XmlSerializer. Кажется, все в порядке, за исключением того, что я сначала считал второстепенным, но оказалось, что это не так.

вот мой код,

 public class OuterElement
        {
            public string firstElement { get; set; }

            public string secondElement { get; set; }

            public InnerElement innerElement = new InnerElement();
        }

        public class InnerElement
        {            
            [XmlAttribute(AttributeName="xsi:type")]
            public string type { get; set; }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(OuterElement));
            OuterElement outerElement = new OuterElement();
            outerElement.firstElement = "name";
            outerElement.secondElement = "CD";
            outerElement.innerElement.type = "testsample";

            using (TextWriter writer = new StreamWriter(@"G:abc.xml"))
            {
                serializer.Serialize(writer, outerElement);
            }
        }
 

Я хочу, чтобы xml выглядел так,

 <OuterElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" lns:xsd="http://www.w3.org/2001/XMLSchema">
    <innerElement xsi:type="testsample">     
    </innerElement>
    <firstElement>name</firstElement> 
    <secondElement>CD</secondElement> 
</OuterElement>
 

Заранее спасибо.

Ответ №1:

Вам нужно объявить правильное пространство имен для атрибута, например:

 public class InnerElement
{
    [XmlAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string type = "bla";
}
 

Это приведет к желаемому результату:

 <OuterElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <innerElement xsi:type="testsample" />
    <firstElement>name</firstElement>
    <secondElement>CD</secondElement>
</OuterElement>
 

Комментарии:

1. Если мне нужен sdtc: valueset означает, какое пространство имен я должен использовать?

2. Я бы не знал, но, основываясь на быстром поиске в Google, я бы сказал ‘urn: hl7-org: sdtc’

Ответ №2:

Вам нужно использовать атрибут XmlTypeAttribute

 [XmlType("testsample")]
public class InnerElement
{
} 
 

Это приведет к следующему:

 <innerElement xsi:type="testsample" />