У меня есть 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
в то время как TextAlign и JustifySingleWord замечательно парсятся
Вопрос почему так происходит и как получить не null значения?