@dmitry8472

Как получить значения полей при десериализации Xml?

У меня есть xml следующего вида:
<office:document-content 
            xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
              xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
              xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0">

	<office:automatic-styles>
		<style:style style:name="S1" style:family="paragraph" style:parent-style-name="headertext">
			<style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>
		</style:style>

		<style:style style:name="S2" style:family="paragraph" style:parent-style-name="formattext">
			<style:paragraph-properties fo:text-align="left" style:justify-single-word="false"/>
		</style:style>

		<style:style style:name="S3" style:family="paragraph" style:parent-style-name="formattext">
			<style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>
		</style:style>
	</office:automatic-styles>

	<office:body>
		<office:text>
                         Текст, который нас не интересует
		</office:text>
	</office:body>
</office:document-content>


Мне необходимо с помощью десериализации получить массив объектов style:style (В данном случае у нас их 3 шт.)
Создаю следующий класс:
// Класс для office:automatic-styles
[Serializable, XmlRoot(ElementName = "automatic-styles", Namespace = "urn:oasis:names:tc:opendocument:xmlns:office:1.0")]
    public class AutomaticStyles {

        public AutomaticStyles () {
        }

        [XmlElement ( ElementName = "style", Namespace = "urn:oasis:names:tc:opendocument:xmlns:style:1.0" )]
        public Style[] Styles {
            get;
            set;
        }
    }

// Класс для style:style
public class Style {

        public Style () {
        }

        [XmlAttribute ( AttributeName = "name", Namespace = "urn:oasis:names:tc:opendocument:xmlns:style:1.0" )]
        public string Name {
            get;
            set;
        }

        [XmlAttribute ( AttributeName = "family", Namespace = "urn:oasis:names:tc:opendocument:xmlns:style:1.0" )]
        public string Family {
            get;
            set;
        }

        [XmlAttribute ( AttributeName = "parent-style-name", Namespace = "urn:oasis:names:tc:opendocument:xmlns:style:1.0" )]
        public string ParentStyleName {
            get;
            set;
        }

        [XmlElement ( ElementName = "paragraph-properties", Namespace = "urn:oasis:names:tc:opendocument:xmlns:style:1.0" )]
        public ParagaphProperties ParagraphProperty {
            get;
            set;
        }
    }

// Класс для style:paragraph-properties
public class ParagaphProperties {

        public ParagaphProperties () {
        }

        [XmlAttribute ( AttributeName = "text-align", Namespace = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" )]
        public TextAlignFormat TextAlign {
            get;
            set;
        }
        
        [XmlAttribute(AttributeName = "justify-single-word", Namespace = "urn:oasis:names:tc:opendocument:xmlns:style:1.0")]
        public bool JustifySingleWord {
            get;
            set;
        }
    }

    public enum TextAlignFormat {

        [System.Xml.Serialization.XmlEnum ( "rigth" )]
        Rigth = 0,

        [System.Xml.Serialization.XmlEnum ( "left" )]
        Left = 1,

        [System.Xml.Serialization.XmlEnum ( "center" )]
        Center = 2
    }


Собственно создаем и запускаем дисериалатор:
// в xmlText лежит мой xml
        var xDoc = XDocument.Parse ( XmlText );
        var nsManager = new XmlNamespaceManager ( new NameTable () );
 // Формируем словарь с пространствами имен
        var TableName = xDoc.Root.Attributes ().Where ( a => a.IsNamespaceDeclaration ).GroupBy ( a => a.Name.Namespace == XNamespace.None ? String.Empty : a.Name.LocalName,
                    a => XNamespace.Get ( a.Value ) ).ToDictionary ( g => g.Key, g => g.First () );

// Получаем элемент office:automatic-styles
         var xmlStyles = xDoc.Root.XPathSelectElement ( "//office:automatic-styles", nsManager );
        var serializer = new XmlSerializer ( typeof ( AutomaticStyles ) );
 // Десериализуем
        var style = (AutomaticStyles)serializer.Deserialize ( xmlStyles.CreateReader () );


В итоге я получаю что в полях Name , Family, ParentStyleName значения null

bc40058bb4484e8388eedaed9dcbb514.jpg

в то время как TextAlign и JustifySingleWord замечательно парсятся

d4794986e5a245f1a1e9bfe1d233fdcc.jpg

Вопрос почему так происходит и как получить не null значения?
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы