2009-12-19 2 views
1

는이 코드가 있습니다XML 파일에서 정보를 읽고이를 클래스의 속성으로 설정하려면 어떻게해야합니까?

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> 

.

답변

2

XML의 모든 요소가 요소이기 때문에 MoveToAttribute()가 도움이되지 않습니다. Icon 요소는 Andromeda 요소의 하위 요소입니다.

이전 3.5xml 처리를 사용하는 경우 XML 문서를 탐색하는 가장 쉬운 방법 중 하나는 XPathNavigator을 사용하는 것입니다. See this example for getting started하지만 기본적으로 생성하고 MoveToChild() 또는 MoveToFollowing()을 호출하면 문서에 넣을 위치로 이동하게됩니다. 당신이 반복하거나 문서를 추구해야 할 경우가 문제가 될 수 있도록 XPathNavigator이 앞으로 유일한 메커니즘이다

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

XPathNavigator nav = doc.CreateNavigator(); 

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

참고.

개체를 값으로 저장하기 위해 XML을 읽는 경우 object serialization to XML을 통해이 작업을 수행하는 것이 중요합니다. 이렇게하면 쉽고 자동으로 XML 파일을 개체로로드 할 수 있습니다. 당신이 그들을로드 할 요소에 따라 객체의

0

마크 귀하의 속성 : 참조 : 어떤 이유로, 당신은 당신의 현재 객체에이 작업을 수행 할 수없는 경우 http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeattribute.aspx

는 다리를 만드는 것을 고려 원래 객체를 반영하고 원래 객체를 반환하는 AsOriginal() 메서드를 추가하는 객체입니다.

은 MSDN 예 오프 사용 : LINQ 개체에서

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; 
} 

는 직렬화 및 역 직렬화를, 당신은 사용할 수 있습니다

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 링크가 올바른 방향으로 가리켜 야합니다. 당신이 태그를 제거하고 사용 후 바로 제거 모든 아이콘 를 찾으려면이 일반 exspression "<Icon>.*</Icon>"를 사용할 수 있습니다

-1

는 ....

많은 짧은

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

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; 
     } 
    } 
관련 문제