Как я могу прочитать информацию из файла XML и установить их для атрибутов в классе? - PullRequest
1 голос
/ 20 декабря 2009

У меня есть этот код:

public class Hero
{
    XmlReader Reader = new XmlTextReader("InformationRepositories/HeroRepository/HeroInformation.xml");
    XmlReaderSettings XMLSettings = new XmlReaderSettings();        

    public ImageSource GetHeroIcon(string Name)
    {
        XMLSettings.IgnoreWhitespace = true;
        XMLSettings.IgnoreComments = true;
        Reader.MoveToAttribute(" //I'm pretty much stuck here.
    }

}

И это файл XML, из которого я хочу прочитать:

<?xml version="1.0" encoding="utf-8" ?>
<Hero>
  <Legion>
    <Andromeda>
      <HeroType>Agility</HeroType>
      <Damage>39-53</Damage>
      <Armor>3.1</Armor>
      <MoveSpeed>295</MoveSpeed>
      <AttackType>Ranged(400)</AttackType>
      <AttackRate>.75</AttackRate>
      <Strength>16</Strength>
      <Agility>27</Agility>
      <Intelligence>15</Intelligence>
      <Icon>Images/Hero/Andromeda.gif</Icon>      
    </Andromeda>    
  </Legion>

  <Hellbourne>

  </Hellbourne>
</Hero>

Я пытаюсь получить элемент, / Icon>.

Ответы [ 4 ]

2 голосов
/ 20 декабря 2009

MoveToAttribute () вам не поможет, потому что все в вашем XML это элементы. Элемент Icon является подэлементом элемента Andromeda.

Один из самых простых способов навигации по документу XML, если вы используете обработку XML до версии 3.5, - это использование XPathNavigator . Посмотрите этот пример для начала работы , но в основном вам просто нужно создать его и вызвать MoveToChild() или MoveToFollowing(), и он приведет вас туда, где вы хотите быть в документе.

XmlDocument doc = new XmlDocument();
doc.Load("InformationRepositories/HeroRepository/HeroInformation.xml");

XPathNavigator nav = doc.CreateNavigator();

if (nav.MoveToFollowing("Icon",""))
    Response.Write(nav.ValueAsInt);

Обратите внимание, что XPathNavigator - это механизм только для пересылки, поэтому он может быть проблематичным, если вам нужно выполнить зацикливание или поиск в документе.

Если вы просто читаете XML, чтобы поместить значения в объекты, вам следует серьезно подумать об этом автоматически через сериализацию объекта в XML . Это даст вам безболезненный и автоматический способ загрузки ваших XML-файлов обратно в объекты.

0 голосов
/ 20 декабря 2009

Вы можете использовать linq to xml:


    public class XmlTest
    {
        private XDocument _doc;

        public XmlTest(string xml)
        {
            _doc = XDocument.Load(new StringReader(xml);
        }

        public string Icon { get { return GetValue("Icon"); } }

        private string GetValue(string elementName)
        {
            return _doc.Descendants(elementName).FirstOrDefault().Value;
        }
    }
0 голосов
/ 20 декабря 2009

Вы можете использовать это регулярное выражение "<Icon>.*</Icon>", чтобы найти все значки затем просто удалите тег удаления и используйте его ....

будет лот короче

  Regex rgx = new Regex("<Icon>.*</Icon>");
   MatchCollection matches = rgx.Matches(xml);

   foreach (Match match in matches)
    {
    string s= match.Value;
    s= s.Remove(0,6)
    s= s.Remove(s.LastIndexOf("</Icon>"),7);
    console.Writeline(s);
    }
0 голосов
/ 20 декабря 2009

Отметьте свои атрибуты в вашем объекте в соответствии с элементом, в который вы хотите загрузить их: Смотри: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeattribute.aspx

Если по какой-то причине вы не можете сделать это с вашим текущим объектом, рассмотрите возможность создания объекта-моста, который отражает ваш оригинальный объект, и добавьте метод AsOriginal (), который возвращает оригинальный объект.

Отработка примера msdn:

public class GroupBridge
{
   [XmlAttribute (Namespace = "http://www.cpandl.com")]
   public string GroupName;

   [XmlAttribute(DataType = "base64Binary")]
   public Byte [] GroupNumber;

   [XmlAttribute(DataType = "date", AttributeName = "CreationDate")]
   public DateTime Today;

   public Group AsOriginal()
   {
    Group g = new Group();
    g.GroupName = this.GroupName;
    g.GroupNumber = this.GroupNumber;
    g.Today = this.Today;

    return g;
   }
}

public class Group
{
   public string GroupName;
   public Byte [] GroupNumber;
   public DateTime Today;
}

Для сериализации и десериализации из объектов LINQ вы можете использовать:

    public static string SerializeLINQtoXML<T>(T linqObject)
    {
         // see http://msdn.microsoft.com/en-us/library/bb546184.aspx
         DataContractSerializer dcs = new DataContractSerializer(linqObject.GetType());

         StringBuilder sb = new StringBuilder();
         XmlWriter writer = XmlWriter.Create(sb);
         dcs.WriteObject(writer, linqObject);
         writer.Close();

         return sb.ToString();
     }

     public static T DeserializeLINQfromXML<T>(string input)
     {
         DataContractSerializer dcs = new DataContractSerializer(typeof(T));

         TextReader treader = new StringReader(input);
         XmlReader reader = XmlReader.Create(treader);
         T linqObject = (T)dcs.ReadObject(reader, true);
         reader.Close();

         return linqObject;
     }

У меня нет примера кода сериализации из не-LINQ объектов, но ссылка MSDN должна указывать вам правильное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...