Это мой первый опыт работы с десериализатором.
Я работаю над XML-файлом, который не публикую, поскольку он слишком велик, и использую для создания классов команду Paste Special 2019 в Visual Studio.
Однако происходит странная вещь: все классы, имеющие тег такого типа:
<value xsi:type = "CD" code = "60975-0" codeSystem = "2.16.840.1.113883.6.1" codeSystemName = "LOINC" displayName = "Displayed Name"/>
Тип свойства не десериализуется и, следовательно, не отображается в классе. Я не понимаю причину такого поведения, но все равно я вставил недостающий код для атрибута типа.
[System.Xml.Serialization.XmlAttributeAttribute()]
public string type
{
get
{ return this.typeField; }
set
{ this.typeField = value; }
}
Но я не могу вставить префикс xsi: перед типом. Я посмотрел эти ссылки Как добавить атрибут xsi:type к элементу XMLhttps://www.codeproject.com/Questions/835371/Create-XML-Node-with-attribute-xsi-type Но, с моим небольшим опытом, я не мог понять, как решить проблему. Я попробовал заменить это:
[System.Xml.Serialization.XmlAttributeAttribute()]
с этим:
[System.Xml.Serialization.XmlAttribute(AttributeName = "xsi:type")]
но получите эту ошибку: InvalidOperationException: «xsi:type» содержит недопустимый символ для имени.
xsi
— это не случайное пространство имен, оно обычно используется в документах XML-схемы, файлах, которые определяют, каким будет содержимое определенного типа XML-документа. Вы не найдете в нем фактических данных. Вы пытаетесь десериализовать документы HL7?
@Panagiotis Kanavos, да, это документ HL7, и в заголовке файла у меня есть: xmlns:xsi = "w3.org/2001/XMLSchema-instance", я не знаю, может ли это быть полезно
Вам нужен унаследованный класс, используя XMLInclude: Learn.microsoft.com/en-us/dotnet/api/… «value» — это базовый класс, а «CD» — это унаследованный класс.
Я нашел решение, в классах, где это необходимо, просто добавьте эту строку:
[System.Xml.Serialization.XmlAttribute(AttributeName = "type",Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
Спасибо вам всем
xsi
— это пространство имен, а не часть имени. Все элементы и атрибуты XML имеют имя. В документе может быть указано пространство имен по умолчанию с помощьюxmlns = "....that...namespace"
, и в этом случае элементам в этом пространстве имен не нужен префикс. Можно было бы[XmlAttribute (Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
НО...