2011-04-09 3 views
2

여기 여기 내 XML 파일XML 노드를 속성으로 선택하고 하위 노드 데이터를 사용하는 방법은 무엇입니까?

<?xml version="1.0" encoding="utf-8" ?> 
<storage> 
<Save Name ="Lifeline"> 
<Seconds>12</Seconds> 
<Minutes>24</Minutes> 
<Hours>9</Hours> 
<Days>25</Days> 
<Months>8</Months> 
<Years>2010</Years> 
<Health>90</Health> 
<Mood>100</Mood> 
</Save> 

<Save Name ="Hellcode"> 
<Seconds>24</Seconds> 
<Minutes>48</Minutes> 
<Hours>18</Hours> 
<Days>15</Days> 
<Months>4</Months> 
<Years>1995</Years> 
<Health>50</Health> 
<Mood>50</Mood> 
</Save> 

이다의에게 XML 및 응용 프로그램에로드합니다 데이터를 얻을 코드입니다.

System.IO.StreamReader sr = new System.IO.StreamReader(@"Saves.xml"); 

System.Xml.XmlTextReader xr = new System.Xml.XmlTextReader(sr); 

System.Xml.XmlDocument save = new System.Xml.XmlDocument(); 

save.Load(xr); 


XmlNodeList saveItems = save.SelectNodes("Storage/Save"); 

XmlNode seconds = saveItems.Item(0).SelectSingleNode("Seconds"); 
sec = Int32.Parse(seconds.InnerText); 

XmlNode minutes = saveItems.Item(0).SelectSingleNode("Minutes"); 
min = Int32.Parse(minutes.InnerText); 

XmlNode hours = saveItems.Item(0).SelectSingleNode("Hours"); 
hour = Int32.Parse(hours.InnerText); 

XmlNode days = saveItems.Item(0).SelectSingleNode("Days"); 
day = Int32.Parse(days.InnerText); 

XmlNode months = saveItems.Item(0).SelectSingleNode("Months"); 
month = Int32.Parse(months.InnerText); 

XmlNode years = saveItems.Item(0).SelectSingleNode("Years"); 
year = Int32.Parse(years.InnerText); 

XmlNode health_ = saveItems.Item(0).SelectSingleNode("Health"); 
health = Int32.Parse(health_.InnerText); 

XmlNode mood_ = saveItems.Item(0).SelectSingleNode("Mood"); 
mood = Int32.Parse(mood_.InnerText); 

이 코드는 "Lifeline"노드에서 데이터를로드합니다. 목록 상자를 사용하여 데이터를로드 할 노드를 선택할 수 있어야합니다.

나는 그런 라인을

XmlNodeList saveItems = save.SelectNodes(string.Format("storage/Save[@Name = '{0}']", name)); 

변수 "이름"목록 상자 항목의 내용에서 문자열을 한 후 사용하려고했습니다 listboxe의 항목에서 문자열입니다. 이 코드를 컴파일하는 동안 예외가 발생합니다. 누군가가 속성으로 선택하고 해당 XML에서 nedeed 데이터를로드하는 방법을 알고 있습니까?

+1

당신이 예외를 제공 할 수

public class MyClass { XElement self; public MyClass(XElement self) { this.self = self; } public string Name { get { return (string)(self.Attribute("Name") ?? "some default value/null"); } set { XAttribute x = source.Attribute("Name"); if(null == x) source.Add(new XAttribute("Name", value)); else x.ReplaceWith(new XAttribute("Name", value)); } } } 

는 그런 다음 같은 것으로 검색을 변경할 수 있습니다. –

+0

[C#의 특성을 사용하여 XML에서 읽는 데 문제가 있습니다] (http://stackoverflow.com/questions/5606075/problem-with-reading-from-an-xml-with-attributes-in-c) – BrokenGlass

답변

0

... 것들에 관해서는

작동하지 않는 경우 개인적으로 낮은 수준의 접근 방식을 사용하여 데이터를 가져오고 오류가 발생하지 않습니다. 를 리모델링 문제를 조금 맞게 :

int saves = 0; 

List<Saves> saveGames = new List<Saves>(); 

saveGames.Add(new Saves()); 

while (textReader.Read()) 
{ 
    if (textReader.NodeType == XmlNodeType.Element) 
     whatsNext = textReader.Name; 
    else if (textReader.NodeType == XmlNodeType.Text) 
    { 
     if (whatsNext == "name") 
     saveGames[saves].name = Convert.ToString(textReader.Value); 
     //else if statements for the rest of your attributes 
     else if (whatsNext == "Save") 
     { 
     saveGames.Add(new Saves()); 
     saves++; 
     } 
    } 
    else if (textReader.NodeType == XmlNodeType.EndElement) 
     whatsNext = ""; 
} 

기본적으로 개체의 목록으로 XML 파일에 모든 것을 던져 목록 상자를 채우기 위해 그 목록을 조작 할 수 있습니다. Saves name = "..."을 갖는 대신 save의 첫 번째 속성으로 name 속성을 사용하십시오.

코드 태그는 나를 싫어합니다. (. ._) 그들이 그렇게 쉽게 깰 왜

+0

코드 줄을 4 자로 들여 쓰기 만하면됩니다. 추가 코드 태그가 필요하지 않습니다! –

+0

나는 항상 탭을 시도하고 편집 페이지, 롤 주위에 던져 질. 타이 각하. – Remm

0

선택 노드가 두 개의 XmlNode 객체를 반환합니다. 나중에 코드에서

XmlNodeList saveItems = save.SelectNodes("Storage/Save"); 

은 첫 번째 하나를 선택하는 것 그리고 saveItems.Item (0)이 경우 이름 = "라이프"와 저장 노드가 될 것입니다 그것의 값을 받고. 따라서 saveItems.Item (1)을 수행하고 노드와 그 값을 선택한다면 다른 노드 집합을 얻을 수 있습니다. 그것은 그 많은 데이터, 필자가이 저장 목록 (생성자)에 모든 정보를로드 좋을 것 한 다음 사용자가 사용하고자하는 하나 거기에서 그리기되지 않기 때문에

1

당신은 XElement를 사용할 수있는 경우 :

XElement xml = XElement.Load(file); 
XElement storage = xml.Element("storage"); 
XElement save = storage.Elements("Save").FirstOrDefault(e => ((string)e.Attribute("Name")) == nameWeWant); 
if(null != save) 
{ 
// do something with it 
} 

가 개인적으로는 메인 프로그램에서 해당 세부 사항을 숨기로하고 XElement를 변환 특성을 가지고 수업을 좋아한다. IE는 Save 클래스가 생성자에서 XElement 노드를 사용하고 내부적으로 전역 적으로 저장하며 속성에 읽기/쓰기를한다고 가정합니다.

예 클래스 :

XElement save = storage.Elements("Save") 
    .FirstOrDefault(e => new MyClass(e).Name == NameWeWant); 
관련 문제