Поскольку вы упомянули об использовании XmlSerializer для десериализации контента,
, чтобы придерживаться его, вот еще одно решение, использующее XmlSerializer.Deserialize (), чтобы помочь вам, если у вас уже есть класс для всего root объект, но не хотите вводить свойства для каждого флага в коллекции прав.
[XmlRoot("root")]
public class RootObject
{
// . . . other properties
// . . . if you have them
// . . . and just don't put here anything
// . . . if you don't need them
public XmlElementDictionary<bool> Rights { get; set; }
}
Если полученный XML имеет точно такой же формат, как вы задали в своем вопросе, следующее проанализирует элементы прав в словаре. Реализуя IXmlSerializable, мы сообщаем системе сериализации, что хотим сами сериализовать / десериализовать этот тип.
Обратите внимание, что поддержка записи и схемы не реализована.
public class XmlElementDictionary<TValue> : Dictionary<string, TValue>, IXmlSerializable
{
void IXmlSerializable.ReadXml(XmlReader reader)
{
string startElementName = reader.Name;
while (reader.Read())
{
string keyName = reader.Name;
if (keyName == startElementName) break;
reader.Read(); // Read element value
base.Add(keyName, (TValue)Convert.ChangeType(reader.Value, typeof(TValue)));
reader.Read(); // Read end element
}
}
System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { throw new NotImplementedException(); }
void IXmlSerializable.WriteXml(XmlWriter writer) { throw new NotImplementedException(); }
}
Обобщение * Реализация 1017 * делает это повторно используемым для других типов. Логика чтения c может быть улучшена для проверки любых атрибутов (теперь не удается, если есть атрибуты, но должна дать вам четкое представление о том, как читать только элемент и его внутренний текст)
Вот как это сделать используйте это:
static void Main(string[] args)
{
RootObject rootObject =
(RootObject)new XmlSerializer
(typeof(RootObject)).Deserialize(new StringReader(XML));
if(rootObject.Rights["admin"])
{
. . . .
}
}